2

假设我有这样的 SQL 表定义

CREATE TABLE X (
   id    integer not null,
   value character varying,
   PRIMARY KEY (id)
);

CREATE TABLE Y (
  start   integer not null,
  end     integer not null,
  value   character vartying,
  PRIMARY KEY (start,end),
  FOREIGN KEY(start)
  REFERENCES X (id)
  ON DELETE CASCADE,
  FOREIGN KEY(end)
  REFERENCES X (id)
  ON DELETE CASCADE
);

第一个表是直截了当的

(clsql:def-view-class x ()
  ((id
    :db-kind :key
    :db-type integer
    :db-constraints :not-null
    :reader id)
   (value
    :initarg :value
    :initform nil
    :db-type (string 255)
    :reader value))
  (:base-table xes))

但我不知道如何做第二个,因为我可以定义 db-kind :key:join. 此外,我没有找到任何关于ON DELETE ...

是否可以使用 clsql oop 模型实现给定的表组合,如果可以,如何实现?

4

1 回答 1

2

我认为最大的问题是复合主键(即PRIMARY KEY (start, end))的声明。使用非复合主键约束设置连接很简单:

(clsql:def-view-class y ()
  ((start
    :db-kind :join
    :db-info (:join-class x
               :home_key y_start
               :foreign_key id
               :set nil)
    :db-type integer
    :db-constraints :primary-key
    :reader start)
  ((end
    :db-kind :base
    :db-type integer
    :db-constraints :not-null
    :reader start)
   (value
    :initarg :value
    :initform nil
    :db-type (string 255)
    :reader value))
  (:base-table yes))

原则上,人们希望将复合键设置为类选项,但目前 CL-SQL 的 OODML 不支持这一点。也不支持表达 ON DELETE 行为。

如果你需要这两个,你应该能够通过回退到execute-commands来做到这一点。

于 2015-07-10T06:12:54.307 回答