1

大家好,我想创建一个具有主键和外键的表。然而,外键引用同一个表的主键。我在网上看了,发现要添加这种约束,我首先需要删除这个约束,加载数据,然后使用 ALTER 命令添加约束。但是,这似乎不起作用。这是查询:

DROP TABLE employee;
CREATE TABLE employee (
  fname    varchar(15) not null, 
  minit    varchar(1),
  lname    varchar(15) not null,
  ssn      char(9),
  bdate    date,
  address  varchar(50),
  sex      char,
  salary   decimal(10,2),
  superssn char(9),
  dno      integer(4),
  primary key (ssn),
  foreign key (superssn) references employee(ssn),
  foreign key (dno) references department(dnumber)
);

这就是我在表中加载数据的方式。

LOAD DATA LOCAL INFILE "employee.dat" 
INTO TABLE employee 
FIELDS ENCLOSED BY "\"" TERMINATED BY ","
;

如果您能给我一些关于如何完成此任务的提示,我将不胜感激。

4

3 回答 3

0

可能的第一个答案:(没有工作)

DROP TABLE employee;

CREATE TABLE employee (
  fname    varchar(15) not null, 
  minit    varchar(1),
  lname    varchar(15) not null,
  ssn      char(9),
  bdate    date,
  address  varchar(50),
  sex      char,
  salary   decimal(10,2),
  superssn char(9),
  dno      integer(4),
  primary key (ssn),
  foreign key (dno) references department(dnumber)
) ENGINE = InnoDB;

LOAD DATA LOCAL INFILE "employee.dat" 
INTO TABLE employee 
FIELDS ENCLOSED BY "\"" TERMINATED BY ",";

ALTER TABLE employee ADD FOREIGN KEY (superssn) REFERENCES employee(ssn);

我将您的创建表查询设置为将表引擎格式设置为 InnoDB,如果您希望使用外键,这是必需的。

可能的第二个答案:

需要注意的是,对于这组查询,不需要插入数据,我能够在我的开发 MySQL 服务器上运行这两个查询而不会产生任何错误。 您仍然需要为部门表添加 FK。

CREATE  TABLE `test_schema`.`employees` (
  `fname` VARCHAR(15) NOT NULL ,
  `minit` VARCHAR(1) NULL ,
  `lname` VARCHAR(15) NOT NULL ,
  `ssn` CHAR(9) NOT NULL ,
  `bdate` DATE NULL ,
  `address` VARCHAR(50) NULL ,
  `sex` CHAR NULL ,
  `salary` DECIMAL(10,2) NULL ,
  `superssn` CHAR(9) NULL ,
  `dno` INT(4) NULL ,
  PRIMARY KEY (`ssn`) ) ENGINE = InnoDB;

ALTER TABLE `test_schema`.`employees` 
  ADD CONSTRAINT `superssn`
  FOREIGN KEY (`superssn` )
  REFERENCES `test_schema`.`employees` (`ssn` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
, ADD INDEX `superssn_idx1` (`superssn` ASC) ;
于 2012-09-16T20:45:41.620 回答
0

我收到了您的问题,您正在尝试按照 elamsari 书中的说明创建一个数据库。

尝试在添加数据之前添加约束“ FOREIGN KEY (superssn) REFERENCES company.employee(ssn); ”,因为添加此约束不会影响将数据添加到表中。

但是,在添加数据之后使用 ALTER table 命令添加与 dno 相关的约束。然后你不会得到错误 1452:

我试过这个,它工作干杯

于 2020-07-19T16:10:08.153 回答
-1

将数据值输入为 null 时,始终使用不带引号的 NULL NOT like "NULL"

这就是您收到错误的原因,因为您输入的是 char(4) 字符串而不是 CHAR(9)

所以使用 NULL 而不是“NULL”

于 2020-07-19T21:56:22.223 回答