I am having an issue with a MySQL database I'm working on. I have a table DAY_ITEM
with two nullable columns, FOOD_ID
and MEAL_ID
, that are foreign keys to the ID
column in FOOD_ITEM
and MEAL_ITEM
tables respectively.
When I try to insert a new record into the FOOD_ITEM
table I get this error:
[HY000][1364] Field 'FOOD_ID' doesn't have a default value
But that column isn't in the FOOD_ITEM
table, the FOOD_ITEM
table only has the ID
column which is the foreign key of the FOOD_ID
column in the DAY_ITEM
table.
Below are my SQL scripts that make the tables, what I am doing wrong in these scripts?
DAY_ITEM Script
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 Script
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
Here is the insert statement I'm using that throws the error:
INSERT INTO FOOD_ITEM (EMAIL, NAME, SERVING_AMOUNT, SERVING_SIZE, SERVING_ID, CALORIES, PROTEIN, CARBS, FAT)
VALUES ('userOne@gravytrack.com', 'Caviar 2', 1.00, 'serving', 0, 250, 12, 13, 14);
I don't see why it's looking at the FOOD_ID
in DAY_ITEM
at all. I'm not inserting into DAY_ITEM
I'm inserting into FOOD_ITEM
. Even though I don't include an ID here it should just auto-increment. That's the way it worked in the past before I added the DAY_ITEM
table.