web-dev-qa-db-fra.com

Mysql crée une table avec plusieurs clés étrangères lors de la suppression

J'essaie de créer une base de données avec plusieurs clés étrangères avec des contraintes de suppression/mise à jour, mais j'ai un code d'erreur 1005 avec les scripts SQL suivants:

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;

Le code d'erreur indique que la table Vineyard ne peut pas être créée. Je souhaite simplement connaître le format approprié pour créer plusieurs clés étrangères avec le contrôle de suppression/mise à jour.

6
Tim Raynor

Votre règle de clé étrangère est ON DELETE SET NULL mais votre définition de colonne est NOT NULL

Modifiez votre définition de colonne et supprimez la partie NOT NULL ou réfléchissez trop à votre règle de clé étrangère. Ça marche:

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;

Démo SQLFiddle

15
juergen d

Visite :

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

Essayez avec create table (innoDB enginer) sans clé étrangère et utilisez la syntaxe update table with constraint, par exemple:

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;

Référence:

Astuce: il n'est pas recommandé d'utiliser des lettres majuscules (ou des cas de chameaux) dans les noms des tables car le comportement diffère du système d'exploitation utilisé:

0
fitorec