Mysql 如何更新主键?
我正在编写一个脚本,它必须更新一些行,而不更改另一个创建一些表的脚本的内容。另一个条件是不能更改或删除约束Mysql 如何更新主键?,mysql,primary-key,mysql-workbench,Mysql,Primary Key,Mysql Workbench,我正在编写一个脚本,它必须更新一些行,而不更改另一个创建一些表的脚本的内容。另一个条件是不能更改或删除约束 SET FOREIGN_KEY_CHECKS = 0; UPDATE TRIP SET REGNUN = 'PKR856' WHERE REGNUM = 'SST005'; UPDATE TRUCK SET REGNUN = 'PKR856' WHERE REGNUM = 'SST005'; SET FOREIGN_KEY_CHECKS = 1; 创建表脚本的内容: CREATE
SET FOREIGN_KEY_CHECKS = 0;
UPDATE TRIP
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
UPDATE TRUCK
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
SET FOREIGN_KEY_CHECKS = 1;
创建表脚本的内容:
CREATE TABLE TRUCK(
REGNUM VARCHAR(10) NOT NULL,
CAPACITY DECIMAL(7) NOT NULL,
WEIGHT DECIMAL(5) NOT NULL,
STATUS VARCHAR(10) NOT NULL,
CONSTRAINT TRUCK_PKEY PRIMARY KEY(REGNUM),
CONSTRAINT TRUCK_STATUS CHECK (STATUS IN ('AVAILABLE', 'MAINTAINED', 'USED'));
还有一些行插入语句
CREATE TABLE TRIP(
TNUM DECIMAL(10) NOT NULL,
LNUM DECIMAL(8) NOT NULL,
REGNUM VARCHAR(10) NOT NULL,
TRIP_DATE DATE NOT NULL,
CONSTRAINT TRIP_PKEY PRIMARY KEY(TNUM),
CONSTRAINT TRIP_FKEY1 FOREIGN KEY(LNUM) REFERENCES DRIVER(LNUM)
CONSTRAINT TRIP_FKEY2 FOREGIN KEY(REGNUM) REFERENCES TRUCK(REGNUM) );
还有一些行插入语句
此脚本由讲师给出,没有错误
现在,我试着:
UPDATE TRIP
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
UPDATE TRUCK
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
这将给我一个错误“无法删除/更新父行。foregin key constriant”。给定脚本中的所有行插入语句都具有完整信息,并且存在regnum=sst005的行。我试着先更新卡车,但也不行。救命啊 约束跳闸\u FKEY1外键(LNUM)引用驱动程序(LNUM)
查看有关MySQL的手册:
限制:拒绝父表的删除或更新操作。指定RESTRICT(或NO ACTION)与省略ON DELETE或ON UPDATE子句相同
您没有设置删除时的和更新时的选项,因此默认情况下它们将是RESTRICT
。并且当子表中的行存在时,不能更新父表主键
您可以像这样更改创建表
:
创建表行程(
TNUM十进制(10)不为空,
LNUM十进制数(8)不为空,
REGNUM VARCHAR(10)不为空,
行程日期不为空,
约束跳闸_PKEY主键(TNUM),
更新级联上的约束TRIP_FKEY1外键(LNUM)引用驱动程序(LNUM)
更新级联上的约束TRIP_FKEY2 FOREGIN键(REGNUM)引用TRUCK(REGNUM);
和查询
UPDATE TRUCK SET REGNUN='PKR856',其中REGNUM='SST005';
将更改两个表中的键,truck
中的主键和trip
中的外键,而不是更新父表中的主键,添加复制除主键以外的所有数据的新行。然后可以更新子表中的外键,然后删除父表中的原始行
INSERT INTO TRUCK (regnum, capacity, weight, status)
SELECT 'PKR856', capacity, weight, status
FROM TRUCK
WHERE regnum = 'SST005';
UPDATE TRIP
SET REGNUM = 'PKR856'
WHERE REGNUM = 'SST005';
DELETE FROM TRUCK WHERE regnum = 'SST005';
快速修复方法是禁用会话的外键检查,然后重新启用它们。禁用外键检查后,MySQL将允许DML更改(INSERT/UPDATE/DELETE),否则将违反外键约束
SET FOREIGN_KEY_CHECKS = 0;
UPDATE TRIP
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
UPDATE TRUCK
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
SET FOREIGN_KEY_CHECKS = 1;
确保所做的更改使数据库处于一致状态,其中没有违反约束的行
SET FOREIGN_KEY_CHECKS = 0;
UPDATE TRIP
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
UPDATE TRUCK
SET REGNUN = 'PKR856'
WHERE REGNUM = 'SST005';
SET FOREIGN_KEY_CHECKS = 1;
另一种选择是,如果脚本没有为表指定ENGINE=,则可以在执行脚本创建表之前,将会话的默认存储引擎临时更改为MyISAM
SELECT @@session.default_storage_engine INTO @prev_default_storage_engine ;
SET default_storage_engine = MYIASM ;
-- execute table creation script
SET default_storage_engine = @prev_default_storage_engine ;
(这里的“诀窍”是MyISAM存储引擎不强制执行外键约束。)检查这里的第一个答案:问题是你不能使用alter/drop CONSTRAINT你试过那篇文章中的第二个答案了吗update IGNORE table set primary_field='value'../code>MySQL允许您关闭外键约束检查。当数据库没有更新级联时,旧的解决方案是用新的REGNUM复制卡车,更新行程并删除旧卡车