2016-04-23 10 views
0

私はいくつかのテーブルを作成する別のスクリプトの内容を変更せずにいくつかの行を更新する必要があるスクリプトを書いています。もう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キーconstriant削除することはできません。。" 私にエラーを与えるだろう。指定されたスクリプト内のすべての行挿入文には完全な情報があり、regnum = sst005の行があります。私はトラックを最初に更新しようとしましたが、どちらもうまくいかないでしょう。助けてください! MySQLのforeign keyについて

+0

ここで最初の答えをチェック:http://stackoverflow.com/questions/2341576/updating-をmysql-primary-key –

+0

問題は、あなたがalter/dropの制約を使うことができないということです。 – strongbaby12

+0

その投稿から2番目の答えを試しましたか? 'update IGNORE table set primary_field = 'value' ...............' – Jhecht

答えて

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

チェックマニュアル:

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; 

スクリプトエンジンを指定しない場合、=テーブルのために、あなたは一時的にテーブルを作成するためのスクリプトを実行する前に、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ストレージエンジンが外部キー制約を強制しないことです。)