2016-04-23 102 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存儲引擎不強制外鍵約束。)