大家好, 我想创建一个具有主键和外键的表。但是外键引用了同一个表的主键。我在网上看了一下,发现为了添加这种约束,我首先需要删除这个约束,加载数据然后用户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 ","
;
如果你能给我一个如何实现这个目标的提示,我将非常感激。
答案 0 :(得分: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);
我设置了你的create table查询,将表引擎格式设置为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) ;
答案 1 :(得分:0)
我有您的问题,您正在尝试创建一个数据库,如elamsari在书中所述。
尝试添加约束“ FOREIGN KEY(superssn)参考company.employee(ssn);” 在添加数据之前,由于添加此约束不会影响将数据添加到表中。
但是,稍后在添加数据之后使用ALTER table命令添加与dno相关的约束。 那么您将不会收到错误1452:
我尝试了这个,它有效 干杯
答案 2 :(得分:-1)
将数据值输入为null时 总是使用不带引号的NULL而不是“ NULL”
这就是为什么会出现错误的原因,因为您输入的是char(4)字符串而不是CHAR(9)
因此,请使用NULL而不是“ NULL”