2016-04-23 32 views
0

Ich schreibe ein Skript, das einige Zeilen aktualisieren muss, ohne den Inhalt eines anderen Skripts zu ändern, das einige Tabellen erstellt. Eine weitere Bedingung ist, dass Sie Einschränkungen nicht ändern oder löschen können.Wie wird der Primärschlüssel aktualisiert?

Inhalt des Tabellenskript erstellen:

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

und es gibt einige Aussagen Einfügen einer Zeile.

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)); 

und es gibt auch einige Zeileneinfügeanweisungen.

Dieses Skript wird vom Dozenten erstellt und hat keinen Fehler.

Jetzt habe ich versucht:

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

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

und das gibt mir eine Fehlermeldung "nicht/update Eltemzeile löschen foregin Schlüssel constriant..". Alle Zeileneinfügeanweisungen im angegebenen Skript haben vollständige Informationen und es gibt Zeilen mit regnum = sst005. Ich habe versucht, den LKW zuerst zu aktualisieren und es wird auch nicht funktionieren. HILFE BITTE!

+0

prüft die erste Antwort hier: http://stackoverflow.com/questions/2341576/updating- mysql-primary-key –

+0

Die Sache ist, dass Sie keine alter/drop constraint – strongbaby12

+0

haben Sie die zweite Antwort von diesem Beitrag versucht? 'update IGNORE table set primary_field = 'value' ...............' – Jhecht

Antwort

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

prüfen Handbuch über MySQL foreign key:

RESTRICT: Lehnt die Lösch- oder Aktualisierungsvorgang für die übergeordnete Tabelle. Die Angabe von RESTRICT (oder NO ACTION) ist dasselbe wie das Auslassen der ON DELETE- oder ON UPDATE-Klausel.

Sie nicht setzen ON DELETE und ON UPDATE Optionen, so werden sie RESTRICT standardmäßig sein. Und Sie können den Primärschlüssel der übergeordneten Tabelle nicht aktualisieren, während die Zeile in der untergeordneten Tabelle existiert.

Sie können Ihre CREATE TABLE wie folgt ändern:

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); 

und Abfrage

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

wird in trip Schlüssel in beiden Tabellen, Primärschlüssel in truck und Fremdschlüssel ändern.

0

Anstatt die Primärschlüssel in der übergeordneten Tabelle zu aktualisieren, fügen Sie neue Zeilen hinzu, die alle Daten mit Ausnahme des Primärschlüssels kopieren. Dann können Sie den Fremdschlüssel in der untergeordneten Tabelle aktualisieren und anschließend die ursprüngliche Zeile in der übergeordneten Tabelle löschen.

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

Die schnelle Lösung besteht darin, Fremdschlüsselüberprüfungen für die Sitzung zu deaktivieren und sie dann erneut zu aktivieren. Mit deaktivierten Fremdschlüsselüberprüfungen erlaubt MySQL DML-Änderungen (INSERT/UPDATE/DELETE), die andernfalls die Fremdschlüsseleinschränkungen verletzen würden.

Stellen Sie sicher, dass die von Ihnen vorgenommenen Änderungen die Datenbank in einen konsistenten Zustand versetzen, in dem keine Zeilen vorhanden sind, die die Einschränkungen verletzen.

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; 

Als weitere Alternative, wenn die Skripts für die Tabellen nicht ENGINE angeben =, könnten Sie den Motor vorübergehend Standardspeicher für die Sitzung zu MyISAM ändern, bevor Sie das Skript ausführen, die Tabellen zu erstellen.

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 ; 

(Der "Trick" dabei ist, dass Speicher-Engine MyISAM nicht für Fremdschlüssel erzwingt.)

Verwandte Themen