如何使用也用作键的外键实现视图类
How to implement viewclass with foreign keys also used as keys
假设我有 SQL table 这样的定义
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
);
第一个table直截了当
(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))
但我不知道如何做第二个 I can either define db-kind
:key
或 :join
。此外,我没有找到任何关于 ON DELETE ...
的规范
甚至可以使用 clsql oop 模型实现给定的 table 组合吗?如果可以,如何实现?
我认为最大的问题是复合主键的声明(即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))
原则上,人们会希望将复合键设置为 class 选项,但目前 CL-SQL 的 OODML 不支持此功能。也不支持表达 ON DELETE 行为。
如果你需要这两个,你应该可以通过回退到 execute-commands。
假设我有 SQL table 这样的定义
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
);
第一个table直截了当
(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))
但我不知道如何做第二个 I can either define db-kind
:key
或 :join
。此外,我没有找到任何关于 ON DELETE ...
甚至可以使用 clsql oop 模型实现给定的 table 组合吗?如果可以,如何实现?
我认为最大的问题是复合主键的声明(即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))
原则上,人们会希望将复合键设置为 class 选项,但目前 CL-SQL 的 OODML 不支持此功能。也不支持表达 ON DELETE 行为。
如果你需要这两个,你应该可以通过回退到 execute-commands。