是否可以更新包含多个表映射的primary key
?
如何更新主表中的 ID ?
CREATE TABLE Master (id INT, name VARCHAR(20),address VARCHAR(20),Primary key(id));
CREATE TABLE Slave_1 (id INT,s1_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s1_id),Foreign Key (id) references Master(id));
CREATE TABLE Slave_2 (id INT,s2_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s2_id),Foreign Key (id) references Master(id));
答案 0 :(得分:0)
您可以执行以下操作:
禁用外键约束。
更新ID /引用
启用外键约束。
答案 1 :(得分:0)
你不能不改变约束。
这是数据库的限制,而不是休眠。
当您更改表id
的{{1}}时,从属的Master
列没有引用。
如果您尝试更改从属表的id
,则相同。
另外,为什么要尝试更改主键?这很不寻常。
答案 2 :(得分:0)
更改主键是非常糟糕的做法。
你不能只创建一个新的主记录,让奴隶指向新记录,然后删除旧记录。这将在Hibernate中起作用,而不需要纯SQL或禁用约束。
答案 3 :(得分:0)
首先,改变身份证是人们通常不应该做的事情。但是如果有任何原因,则无法使用Hibernate(即。和映射类)完成。如果您尝试更改实体ID,Hibernate将不会容忍并引发错误。
要进行更改,您必须使用本机查询。也许最安全,最简单的方法就是让DB为您完成工作。您只需要为外键列定义“on update cascade”操作。
CREATE TABLE Master (id INT, name VARCHAR(20),address VARCHAR(20),Primary key(id));
CREATE TABLE Slave_1 (id INT,s1_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s1_id),Foreign Key (id) references Master(id) **on update cascade**);
CREATE TABLE Slave_2 (id INT,s2_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s2_id),Foreign Key (id) references Master(id) **on update cascade**);
这样,无论何时更改主表中的ID列,它都会自动级联到所有引用列。