MySQL外键不允许插入

时间:2016-03-28 06:22:41

标签: mysql sql

我遇到了我正在研究的MySQL数据库的问题。我有一个表public File getTileViewImageDirectory() { // check SDCard if available or not, if available store in SDCard // else store in internal storage if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED) && !android.os.Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { File[] dirs = ContextCompat.getExternalFilesDirs(context, null); File directory = new File(dirs[dirs.length > 1 ? 1 : 0].getParentFile().getAbsolutePath() + AppConstants.TILEVIEW_IMAGE_LOCATION); return directory; } else { return new File(context.getFilesDir().getAbsolutePath() + AppConstants.TILEVIEW_IMAGE_LOCATION); } } ,其中包含两个可为空的列,DAY_ITEMFOOD_ID,它们是MEAL_IDIDFOOD_ITEM列的外键表格分别为。

当我尝试将新记录插入MEAL_ITEM表时,我收到此错误:

FOOD_ITEM

但是该列不在[HY000][1364] Field 'FOOD_ID' doesn't have a default value 表中,FOOD_ITEM表只有FOOD_ITEM列,它是ID列中的FOOD_ID列的外键。 DAY_ITEM表。

以下是制作表格的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);

修改

这是我使用的插入语句抛出错误:

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

我不明白为什么它会在FOOD_ID中查看DAY_ITEM。我没有插入DAY_ITEM我插入FOOD_ITEM。即使我没有在这里包含ID,它也应该自动增加。这是我在添加DAY_ITEM表之前过去的工作方式。

2 个答案:

答案 0 :(得分:0)

在父表的id列中插入值为NULL的行,然后可以在子表中插入NULL值。

更好的选择是你应该避免使用NULL值......

<强>更新

正如您在insert语句中看到的,food_id和meal_id字段未包含在insert语句中意味着您在这些字段中插入了默认的NULL值,而在主表中您已将这些字段设置为not null意味着您正在尝试插入父表中不存在的值(NULL)。

答案 1 :(得分: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);

无需在第二张表中更改。