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