web-dev-qa-db-de.com

Mysql-Create-Tabelle mit mehreren Fremdschlüsseln für den Löschsatz Null

Ich versuche, eine Datenbank mit mehreren Fremdschlüsseln mit Lösch-/Aktualisierungseinschränkungen zu erstellen, aber ich habe einen Fehlercode 1005 mit den folgenden SQL-Skripts erhalten:

CREATE TABLE Worker (
 WorkerID smallint auto_increment,
 WorkerType  varchar(45) NOT NULL,
 WorkerName  varchar(45) NOT NULL,
 Position    varchar(45) NOT NULL,
 TaxFileNumber int NOT NULL,
 Address    varchar(100) ,
 Phone      varchar(20) ,
 SupervisorID  smallint ,
 PRIMARY KEY (WorkerID),
 FOREIGN KEY (SupervisorID) REFERENCES Worker(WorkerID)
    ON DELETE SET NULL
    ON UPDATE CASCADE
)Engine=InnoDB;

CREATE TABLE Grape (
    GrapeID smallint NOT NULL,
    GrapeType varchar(45) NOT NULL,
    JuiceConversionRatio int,
    StorageContainer ENUM('Stainless Steel Tank','Oak Barrel'),
    AgingRequirement int,
    PRIMARY KEY (GrapeID)
)Engine=InnoDB;

CREATE TABLE Vineyard (
    VineyardID smallint auto_increment,
    VineyardName VARCHAR(45) NOT NULL,
    FarmerID    smallint NOT NULL,
    GrapeID smallint NOT NULL,
    ComeFrom    varchar(45) NOT NULL,
    HarvestedAmount int,
    RipenessPercent int,
    PRIMARY KEY (VineyardID),
    FOREIGN KEY (FarmerID) REFERENCES Worker(WorkerID)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
    FOREIGN KEY (GrapeID) REFERENCES Grape(GrapeID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
)Engine=InnoDB;

Der Fehlercode besagt, dass die Vineyard-Tabelle nicht erstellt werden kann. Ich möchte nur das richtige Format zum Erstellen mehrerer Fremdschlüssel mit Lösch-/Aktualisierungssteuerung kennen.

6
Tim Raynor

Ihre Fremdschlüsselregel ist ON DELETE SET NULL, aber Ihre Spaltendefinition ist NOT NULL

Ändern Sie entweder Ihre Spaltendefinition und entfernen Sie den NOT NULL-Teil, oder denken Sie an Ihre Fremdschlüsselregel. Das funktioniert:

CREATE TABLE Vineyard (
    VineyardID smallint auto_increment,
    VineyardName VARCHAR(45) NOT NULL,
    FarmerID    smallint,
    GrapeID smallint,
    ComeFrom    varchar(45) NOT NULL,
    HarvestedAmount int,
    RipenessPercent int,
    PRIMARY KEY (VineyardID),
    FOREIGN KEY (FarmerID) REFERENCES Worker(WorkerID)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
    FOREIGN KEY (GrapeID) REFERENCES Grape(GrapeID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
)Engine=InnoDB;

SQLFiddle Demo

15
juergen d

Besuch :

https://developer.Android.com/training/basics/data-storage/databases.html#DefineContract

Cursor c = db.query(
    FeedEntry.TABLE_NAME,                     // The table to query
    projection,                               // The columns to return
    selection,                                // The columns for the WHERE clause
    selectionArgs,                            // The values for the WHERE clause
    null,                                     // don't group the rows
    null,                                     // don't filter by row groups
    sortOrder                                 // The sort order
    );
0
Akash

Versuchen Sie es mit create table (innoDB enginer) ohne Fremdschlüssel und verwenden Sie die update table with constraint-Syntax. Beispiel:

ALTER TABLE `vineyard`
        ADD CONSTRAINT `relation_farmer_has_many_vineyards`
            FOREIGN KEY (`farmer_id`)
            REFERENCES `worker` (`worker_id`)
            ON DELETE SET NULL
            ON UPDATE CASCADE;

Referenz:

Trick: Es wird nicht empfohlen, in den Namen der Tabellen Großbuchstaben (oder Kamelbuchstaben) zu verwenden, deren Verhalten sich vom verwendeten Betriebssystem unterscheidet:

0
fitorec