我有错误#150 我在不同的论坛上看,但他们所说的是外键必须有相同的类型。
这是我的代码:
USE `dbask`;
set names utf8;
/*users*/
CREATE TABLE IF NOT EXISTS `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(30) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`permission` VARCHAR(10) NULL,
`firstname` VARCHAR(40) NULL,
`lastname` VARCHAR(40) NULL,
`birthdate` VARCHAR(255) NULL,
`picture_link` VARCHAR(255) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
/*questions*/
CREATE TABLE IF NOT EXISTS `questions` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(30) NOT NULL,
`asked_username` VARCHAR(30) NULL,
`question` VARCHAR(255) NOT NULL,
`answer` VARCHAR(255) NULL,
`time_asked` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_questions_to_users`
FOREIGN KEY (`username`)
REFERENCES `users`(`username`)
ON DELETE CASCADE
ON UPDATE CASCADE
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
这两种类型都是VARCHAR(30)
,所以我不知道问题是什么。
答案 0 :(得分:1)
您必须在用户表格中将用户名创建为 PRIMARY KEY ,然后才能在上创建 FOREIGN KEY 强>问题表。或者您可以使用 UNIQUE KEY 创建 FOREIGN KEY ,如下所示
偏离SQL标准:引用非UNIQUE键的FOREIGN KEY约束不是标准SQL。它是标准SQL的InnoDB扩展。
USE `dbask`;
SET NAMES utf8;
/*users*/
CREATE TABLE IF NOT EXISTS `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(30) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`permission` VARCHAR(10) NULL,
`firstname` VARCHAR(40) NULL,
`lastname` VARCHAR(40) NULL,
`birthdate` VARCHAR(255) NULL,
`picture_link` VARCHAR(255) NULL,
PRIMARY KEY (`id`), UNIQUE KEY (username))
ENGINE = INNODB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
/*questions*/
CREATE TABLE IF NOT EXISTS `questions` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(30) NOT NULL,
`asked_username` VARCHAR(30) NULL,
`question` VARCHAR(255) NOT NULL,
`answer` VARCHAR(255) NULL,
`time_asked` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_questions_to_users`
FOREIGN KEY (`username`)
REFERENCES `users`(`username`)
ON DELETE CASCADE
ON UPDATE CASCADE
)
ENGINE = INNODB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
答案 1 :(得分:0)
与SQL标准的偏差:引用的FOREIGN KEY约束 非UNIQUE键不是标准SQL。它是InnoDB的扩展 标准SQL。