如何使用也用作键的外键实现视图类

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