【问题标题】:MySQL: How to insert values in a table which has two foreign keysMySQL:如何在具有两个外键的表中插入值
【发布时间】:2016-05-03 17:52:19
【问题描述】:

我将 MySQL 与 NodeJS 一起使用,并且我有一个如下所示的表:

CREATE TABLE IF NOT EXISTS `keycomponent`.`Transaction` (
  `TransactionID` INT NOT NULL,
  `TransactionDate` DATE NOT NULL,
  `Amount` MEDIUMTEXT NOT NULL,
  `CreationDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `TransactionDescriptionPK` INT NOT NULL,
  `FilePK` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`TransactionID`),
  UNIQUE INDEX `TransactionID_UNIQUE` (`TransactionID` ASC),
  INDEX `FilePK_idx` (`FilePK` ASC),
  INDEX `TransactionDescriptionPK_idx` (`TransactionDescriptionPK` ASC),
  CONSTRAINT `TransactionDescriptionPK`
    FOREIGN KEY (`TransactionDescriptionPK`)
    REFERENCES `keycomponent`.`TransactionDescription` (`TransactionDescriptionPK`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FilePK`
    FOREIGN KEY (`FilePK`)
    REFERENCES `keycomponent`.`File` (`Filename`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

它包含两个外键,当我尝试将值插入另一个表时出现此错误

Error: ER_NO_DEFAULT_FOR_FIELD: Field 'TransactionDescriptionPK' doesn't have a default value

该列不应该自动从另一个表中获取主键吗?

我的查询'

    'INSERT INTO Transaction '+
              'SET TransactionID = ?, TransactionDate = ?, Amount = ?, TransactionDescriptionPK = ?, FilePK = ?',
[transId,date,amount,"primary key to the TransactionDescription table","primary key to the File table"]

【问题讨论】:

  • 这样不行。约束不是为了向程序提供数据,它们是为了防止程序/用户将无效数据插入表中。这就是为什么它们被称为约束。您需要拉取、插入或更新代码中的值。

标签: mysql node.js


【解决方案1】:

不,外键不会自动从另一个表中获取值。 mysql 应该如何确定它应该从父表中获取哪个 TransactionDescriptionPK 值?您必须为声明为非空且没有默认值的所有外键字段提供值,就像为任何其他类似字段所做的那样。

附注:如果一个字段被声明为 pk,您不必在其上创建唯一索引。

【讨论】:

    【解决方案2】:

    我认为您的错误与外键无关。您的TransactionDescription 表中有一个TransactionDescriptionPK 列,该列已设置为not null,但您没有在此插入语句中为其提供任何值。

    【讨论】:

    • 那我该如何添加外键呢?
    • 我认为您不了解外键是什么。外键仅检查以确保您的第二个(子)表中的值在第一个(父)表中具有相应的行。插入新的父表行时,外键不会自动将数据添加到您的子表中。
    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多