2016-03-28 9 views
0

私が作業しているMySQLデータベースに問題があります。私はテーブルDAY_ITEMと2つのnull可能な列FOOD_IDMEAL_IDを持っています。それはIDの列の外部キーで、それぞれFOOD_ITEMMEAL_ITEMのテーブルです。MySQL外部キーが挿入できない

私はこのエラーを取得するFOOD_ITEMテーブルに新しいレコードを挿入しよう:

[HY000][1364] Field 'FOOD_ID' doesn't have a default value 

しかし、その列がFOOD_ITEMテーブルにない、FOOD_ITEMテーブルがあるだけでID列を持っていますDAY_ITEMテーブルのFOOD_ID列の外部キー。

以下は、これらのスクリプトで間違っているテーブルを作成する私のSQLスクリプトですか?

DAY_ITEMスクリプト

CREATE TABLE DAY_ITEM 
(
    ID  BIGINT  NOT NULL, 
    EMAIL  VARCHAR(50) NOT NULL, 
    NAME  VARCHAR(100) NULL  DEFAULT NULL, 
    MOD_ID SMALLINT  NOT NULL, #MOD = Meal Of Day 
    MOD_NAME VARCHAR(50) NULL  DEFAULT NULL, 
    DAYS_DATE DATE   NOT NULL, 
    FOOD_ID BIGINT  NULL  DEFAULT NULL, 
    MEAL_ID BIGINT  NULL  DEFAULT NULL 
); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_PK_ID 
PRIMARY KEY (ID); 

ALTER TABLE DAY_ITEM 
MODIFY COLUMN ID BIGINT NOT NULL AUTO_INCREMENT; 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_FK_EMAIL 
FOREIGN KEY (EMAIL) REFERENCES USER_ACCOUNT (EMAIL); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_FK_FOOD_ID 
FOREIGN KEY (FOOD_ID) REFERENCES FOOD_ITEM (ID); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_FK_MEAL_ID 
FOREIGN KEY (MEAL_ID) REFERENCES MEAL_ITEM (ID); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT MEAL_ITEM_UK_EMAIL_DAYSDATE_FOODID 
UNIQUE (EMAIL, DAYS_DATE, MOD_ID, FOOD_ID); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT MEAL_ITEM_UK_EMAIL_DAYSDATE_MEALID 
UNIQUE (EMAIL, DAYS_DATE, MOD_ID, MEAL_ID); 

FOOD_ITEMスクリプト

CREATE TABLE FOOD_ITEM 
(
    ID    BIGINT  NOT NULL, 
    EMAIL   VARCHAR(50) NOT NULL, 
    NAME   VARCHAR(100) NULL  DEFAULT NULL, 
    SERVING_AMOUNT DECIMAL(6, 2) NULL  DEFAULT NULL, 
    SERVING_SIZE VARCHAR(50) NULL  DEFAULT NULL, 
    SERVING_ID  SMALLINT  NOT NULL, 
    CALORIES  SMALLINT  NULL  DEFAULT NULL, 
    PROTEIN  SMALLINT  NULL  DEFAULT NULL, 
    CARBS   SMALLINT  NULL  DEFAULT NULL, 
    SUGAR   SMALLINT  NULL  DEFAULT NULL, 
    FIBER   SMALLINT  NULL  DEFAULT NULL, 
    FAT   SMALLINT  NULL  DEFAULT NULL, 
    SAT_FAT  SMALLINT  NULL  DEFAULT NULL, 
    MONO_FAT  SMALLINT  NULL  DEFAULT NULL, 
    POLY_FAT  SMALLINT  NULL  DEFAULT NULL, 
    TRANS_FAT  SMALLINT  NULL  DEFAULT NULL, 
    SODIUM   BIGINT  NULL  DEFAULT NULL, 
    CHOLESTEROL BIGINT  NULL  DEFAULT NULL 
); 

ALTER TABLE FOOD_ITEM 
ADD CONSTRAINT FOOD_ITEM_PK_ID 
PRIMARY KEY (ID); 

ALTER TABLE FOOD_ITEM 
MODIFY COLUMN ID BIGINT NOT NULL AUTO_INCREMENT; 

ALTER TABLE FOOD_ITEM 
ADD CONSTRAINT FOOD_ITEM_FK_EMAIL 
FOREIGN KEY (EMAIL) REFERENCES USER_ACCOUNT (EMAIL); 

ALTER TABLE FOOD_ITEM 
ADD CONSTRAINT FOOD_ITEM_UK_EMAIL_NAME_SERVING 
UNIQUE (EMAIL, NAME, SERVING_AMOUNT, SERVING_SIZE, SERVING_ID); 

EDITここ

私はエラーがスローされます使用していinsert文は次のとおりです。

INSERT INTO FOOD_ITEM (EMAIL, NAME, SERVING_AMOUNT, SERVING_SIZE, SERVING_ID, CALORIES, PROTEIN, CARBS, FAT) 
VALUES ('[email protected]', 'Caviar 2', 1.00, 'serving', 0, 250, 12, 13, 14); 

なぜFOOD_IDDAY_ITEMにあるのかわかりません。私はFOOD_ITEMに挿入していますDAY_ITEMに挿入されていません。私はここにIDを含まないにもかかわらず、それは自動的に増分すべきです。それは私がDAY_ITEMテーブルを追加する前にそれが過去に働いた方法です。

+1

[Field 'id'にはデフォルト値がありません](http://stackoverflow.com/questions/25865104/field-id-doesnt-have-a-default-value) – MusicLovingIndianGirl

+0

@MusicLovingIndianGirlいいえ、まったく同じ問題ではありませんでした。あなたは私の実際の質問やタイトルだけを読んだのですか? – Graham

答えて

0

親表のID列に値NULLの行を挿入すると、NULL値を子表に挿入できます。

より良いオプションが...あなたはNULL値を避けるべきである

更新:あなたはfood_idとmeal_idフィールドがINSERT文に含まれていない、あなたのINSERT文で見ることができるように意味

あなたが挿入されていますこれらのフィールドにはデフォルトのNULL値が設定されていますが、これらのフィールドをNULLに設定しているマスターテーブルでは、親テーブルに存在しない値(NULL)を挿入しようとしています。

+0

null値を避けるには、リンクテーブルを使用する必要がありますか? – Graham

+0

columnプロパティをnullに設定するか、デフォルト値を割り当てることができます。 –

+0

スクリプトを見ると、デフォルト値が設定されていることがわかります。 – Graham

0

Default NULL値を削除して試してみて、挿入レコード中にNULLを渡してください。スクリプトのような示し

...

CREATE TABLE DAY_ITEM 
(
    ID  BIGINT  NOT NULL, 
    EMAIL  VARCHAR(50) NOT NULL, 
    NAME  VARCHAR(100) NULL  DEFAULT NULL, 
    MOD_ID SMALLINT  NOT NULL, #MOD = Meal Of Day 
    MOD_NAME VARCHAR(50) NULL  DEFAULT NULL, 
    DAYS_DATE DATE   NOT NULL, 
    FOOD_ID BIGINT  NULL, 
    MEAL_ID BIGINT  NULL 
); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_PK_ID 
PRIMARY KEY (ID); 

ALTER TABLE DAY_ITEM 
MODIFY COLUMN ID BIGINT NOT NULL AUTO_INCREMENT; 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_FK_EMAIL 
FOREIGN KEY (EMAIL) REFERENCES USER_ACCOUNT (EMAIL); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_FK_FOOD_ID 
FOREIGN KEY (FOOD_ID) REFERENCES FOOD_ITEM (ID); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT DAY_ITEM_FK_MEAL_ID 
FOREIGN KEY (MEAL_ID) REFERENCES MEAL_ITEM (ID); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT MEAL_ITEM_UK_EMAIL_DAYSDATE_FOODID 
UNIQUE (EMAIL, DAYS_DATE, MOD_ID, FOOD_ID); 

ALTER TABLE DAY_ITEM 
ADD CONSTRAINT MEAL_ITEM_UK_EMAIL_DAYSDATE_MEALID 
UNIQUE (EMAIL, DAYS_DATE, MOD_ID, MEAL_ID); 

第二のテーブルに変更する必要はありません。

関連する問題