MySQL - 使用外键将行复制到另一个表

时间:2021-03-02 15:25:35

标签: mysql foreign-keys

我想从该表中复制 1 行:

tableold
-----------
oid (primary key, auto_incremment)
name
age
detail

到这张桌子:

tablenew
------------
nid (primary key, auto_incremment)
fid (foreign key to another table)
name
age
detail

使用此 SQL 命令:

INSERT INTO tablenew (tablenew.name, tablenew.age, tablenew.detail)
SELECT tableold.name, tableold.age, tableold.detail
FROM tableold
WHERE tableold.oid = 123;

但我收到错误:

<块引用>

错误 1364 (HY000):字段“fid”没有默认值

是否可以手动将外键“fid”添加到 SQL-Command 中?

*编辑,我添加了 CREATE 表语句:

CREATE TABLE `othertable` (
  `fid` int NOT NULL AUTO_INCREMENT,
  `value1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `value2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `value3` longtext CHARACTER SET utf8 COLLATE utf8_general_ci,
  `value4` longtext CHARACTER SET utf8 COLLATE utf8_general_ci,
  PRIMARY KEY (`fid`),
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8;

CREATE TABLE `tablenew` (
  `nid` int NOT NULL AUTO_INCREMENT,
  `fid` int NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `age` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `detail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`sid`),
  KEY `fid_fkey` (`fid`),
  CONSTRAINT `fid_fkey` FOREIGN KEY (`fid`) REFERENCES `othertable` (`fid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `tableold` (
  `oid` int NOT NULL AUTO_INCREMENT,
  `name` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `age` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `detail` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB AUTO_INCREMENT=157 DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:0)

我已经解决了:

INSERT INTO tablenew (tablenew.fid, tablenew.name, tablenew.age, tablenew.detail)
SELECT 'value', tableold.name, tableold.age, tableold.detail
FROM tableold
WHERE tableold.oid = value;