Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何更新主键?_Mysql_Primary Key_Mysql Workbench - Fatal编程技术网

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复制卡车,更新行程并删除旧卡车