我已经知道使用'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)
)
我认为我的级联声明存在一些问题,你觉得它们有什么问题吗?这里值得注意的是,Parent表的主键为2列(双主键)。我不确定它是否正常。我希望这是我在创建表查询中的错,而不是SQLite。上次,我在SQLite中成功级联后非常高兴,它让我非常喜欢将SQLite用于我当前的项目。
我现在知道更新和删除级联的问题,只是重新设计了表。但是,它仅适用于VS 2010中的SQLite查询窗口(首先使用PRAGMA foreign_keys =)。我的C#代码不起作用,而我在演示项目中成功完成了。真的坚持这个。
答案 0 :(得分: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
)
答案 1 :(得分:0)
有点晚了,但我把它作为一个自我注释添加到那些偶然遇到同样问题的人。
添加"外键= true"您的C#应用程序中的连接字符串不会激活外键支持。而是做这样的事情:
query.CommandText = "PRAGMA foreign_keys = ON;";
query.ExecuteNonQuery();
这将为当前连接启用外键支持。