删除 sql 语句违反了完整性约束。发生这种情况是因为一个表的 id 在另一个表中用作主键。但是我还是想通过使用 CASCADE 删除它们。
但是 hsqldb 的正确语法是什么?
删除 sql 语句违反了完整性约束。发生这种情况是因为一个表的 id 在另一个表中用作主键。但是我还是想通过使用 CASCADE 删除它们。
但是 hsqldb 的正确语法是什么?
该DELETE
语句不支持“级联”关键字(手册中有明确记录)
您需要设置外键约束以级联删除:
create table playlist
(
id integer primary key not null,
... other columns ...
);
create table playlistmovies
(
id integer primary key not null,
playlist_id integer not null,
... other columns
);
alter table playlistmovies
add constraint fk_plm_playlist
foreign key (playlist_id) references playlist(id)
on delete cascade;
然后,当您删除播放列表时,引用该播放列表的所有行也会被删除。
在创建子表时,您在外键约束中添加“删除级联”,如下所示。
ALTER TABLE ADD [CONSTRAINT] FOREIGN KEY () REFERENCES () ON DELETE CASCADE;
使用与在表定义中指定外键时相同的约束语法向表中添加外键约束。
之后,您删除您的父记录,它也会删除子记录。
在 HSQLDB 的当前版本(我使用的是 2.5.0)中,可以在列定义语句上指定 ON DELETE CASCADE 修饰符,不需要使用 ALTER TABLE 添加它。这允许简洁、更易读的 SQL。
例如,这有效:
CREATE TABLE IF NOT EXISTS TestRecord
(
-- Primary key column
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
-- Example fields
sValue VARCHAR(100),
iValue INTEGER,
);
CREATE TABLE IF NOT EXISTS TestRecordJoin
(
-- Foreign key column, specifying cascade delete behavior.
kRecord INTEGER NOT NULL FOREIGN KEY REFERENCES TestRecord ON DELETE CASCADE,
-- Example fields
sValue2 VARCHAR(64) NOT NULL,
iValue2 INTEGER NOT NULL
);