2016-04-23 48 views
0

我正在编写一个脚本,它必须更新某些行而不更改另一个创建几个表的脚本的内容。另一个条件是你不能改变或放弃约束。如何更新主键?

内容创建表的脚本:

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关键constriant。”。给定脚本中的所有行插入语句都有完整的信息,并且行中有regnum = sst005。我试图先更新卡车,但它也不行。请帮助!

+0

检查第一个答案在这里:http://stackoverflow.com/questions/2341576/updating- mysql-primary-key –

+0

问题是你不能使用修改/删除约束 – strongbaby12

+0

你是否尝试过该帖子的第二个答案? 'update IGNORE table set primary_field ='value'...............' – Jhecht

回答

1
CONSTRAINT TRIP_FKEY1 FOREIGN KEY(LNUM) REFERENCES DRIVER(LNUM) 

检查有关MySQL foreign key手册:

RESTRICT:拒绝对父表的删除或更新操作。指定RESTRICT(或NO ACTION)与省略ON DELETE或ON UPDATE子句相同。

你不设置ON DELETEON UPDATE选项,所以他们会RESTRICT默认。而且,当子表中的行存在时,您无法更新父表主键。

你可以改变你CREATE TABLE这样的:

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) ON UPDATE CASCADE 
    CONSTRAINT TRIP_FKEY2 FOREGIN KEY(REGNUM) REFERENCES TRUCK(REGNUM) ON UPDATE CASCADE); 

和查询

UPDATE TRUCK SET REGNUN = 'PKR856' WHERE REGNUM = 'SST005'; 

将改变键两个表中,在truck主键和trip外键。

0

除了更新父表中的主键之外,还添加了复制除主键之外的所有数据的新行。然后,您可以更新子表中的外键,然后删除父表中的原始行。

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'; 
0

快速修复是为会话禁用外键检查,然后重新启用它们。在禁用外键检查的情况下,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; 

又或者,如果脚本不指定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存储引擎不强制外键约束。)