Как реализовать класс просмотра с внешними ключами, также используемыми в качестве ключей

Предположим, у меня есть определения таблиц 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, и если да, то как?

1 ответ

Решение

Я думаю, что самой большой проблемой является объявление составного первичного ключа (т.е. 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))

В принципе, можно настроить составной ключ как параметр класса, но в настоящее время это не поддерживается в OODML CL-SQL. Также нет поддержки для выражения поведения ON DELETE.

Если вам нужны оба из них, вы можете сделать это, вернувшись к execute-командам.

Другие вопросы по тегам