sql - 删除和更新级联不会影响 SQLite 中的子表?

标签 sql sqlite cascade

我知道使用 'PRAGMA foreign_keys = ON' 或在我的 SQLite 连接字符串中包含一个属性,如下所示:

con = "Data source = myData.sdb; foreign keys = true";

我还制作了一个演示进行测试,它运行良好,但是演示非常简单,父表只有一个主键。现在我要处理一个更复杂的情况,级联根本不起作用。这是我的表格( parent 和 child ):
-- Parent table
create table ChuyenCongTac(
 MaNV varchar(12) references NhanVien(MaNV) on delete cascade on update cascade,
 NgayChuyenCT datetime,
 MaPhongTruoc int references PhongBan(MaPhong) on delete cascade on update cascade
 MaPhongSau int references PhongBan(MaPhong) on delete cascade on update cascade,
 NoiCongTacNgoai nvarchar(100),
 primary key (MaNV,NgayChuyenCT)
);

-- Child table
create table ChucVuChuyenCongTac(
 MaNV varchar(12) references ChuyenCongTac(MaNV) on delete cascade on update cascade,
 NgayChuyenCT datetime references ChuyenCongTac(NgayChuyenCT) on delete cascade on update cascade,
 CongTacTruoc bit,
 primary key(MaNV,NgayChuyenCT,MaChucVu,CongTacTruoc)
)

我认为我的级联声明有一些问题,你觉得它们有什么问题吗?这里值得注意的一点是父表有一个 2 列的主键(一个双主键)。我不确定是否可以。我希望这是我在创建表查询时的错,而不是 SQLite。上次,在 SQLite 中成功进行级联后,我非常高兴,这让我非常愿意在我当前的项目中使用 SQLite。

更新

我现在知道更新和删除级联的问题,只是重新设计了表。但是,它仅在 VS 2010 的 SQLite 查询窗口中有效(首先使用 PRAGMA foreign_keys=on)。我的 C# 代码不起作用,而我在演示项目中已成功完成。真的卡在这了。

最佳答案

您已将两个单独的单列外键从子项声明到父项。

要声明多列外键,请使用如下语法:

CREATE TABLE ChucVuChuyenCongTac(
    MaNV VARCHAR(12),
    NgayChuyenCT DATETIME,
    CongTacTruoc BIT,
    PRIMARY KEY(MaNV, NgayChuyenCT, MaChucVu, CongTacTruoc),
    FOREIGN KEY(MaNV, NgayChuyenCT)
        REFERENCES ChuyenCongTac(MaNV, NgayChuyenCT)
        ON DELETE CASCADE
        ON UPDATE CASCADE
)

关于sql - 删除和更新级联不会影响 SQLite 中的子表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16380878/

相关文章:

php - 使用 PHP 支持多种数据库类型

python - 使用 Python 进行 SQLite 查询

opencv_traincascade 总是卡住

当我使用 RIGHT JOIN 时,MYSQL 无法识别字段,但当我使用 NATURAL JOIN 时,MYSQL 可以识别字段

MySQL group_concat 问题

sql - 如何声明变量并在同一个 Oracle SQL 脚本中使用它?

当 belongsTo 指定多个类时,Grails belongsTo 级联删除?

mysql - 我的 Select Case 有问题,输出不工作

Android:我需要关闭 Cursor 对象吗?

php - 多字段级联mysql