1

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

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

我还制作了一个演示进行测试,它工作正常,但是演示非常简单,父表只有一个主键。现在我要处理一个更复杂的情况,级联根本不起作用。这是我的表格(父母和孩子):

-- 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# 代码不起作用,而我在演示项目中已成功完成。真的卡在这了。

4

2 回答 2

2

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

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

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
)
于 2013-05-05T10:12:05.160 回答
2

有点晚了,但我将其添加为自我说明,并为那些偶然发现相同问题的人添加。

在 C# 应用程序的连接字符串中添加“外键 = true”不会激活外键支持。而是做这样的事情:

query.CommandText = "PRAGMA foreign_keys = ON;";
query.ExecuteNonQuery();

这将为当前连接启用外键支持。

于 2015-01-09T14:10:09.330 回答