0

我正在尝试在 3 个表之间设置外键并收到标题中的错误,所有 _id 字段都是无符号的,并且格式与它们的父级相同。

有问题的表:

CREATE TABLE `Group` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
  `name_url` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `order` int(11) NOT NULL DEFAULT '0',
  `internal` tinyint(1) NOT NULL,
  `updated` int(11) DEFAULT NULL,
  `created` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `Permission` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `description` tinytext COLLATE utf8_unicode_ci,
  `controller` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `action` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `updated` int(11) DEFAULT NULL,
  `created` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `Group_Permission` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `group_id` int(11) unsigned DEFAULT NULL,
  `permission_id` int(11) unsigned DEFAULT NULL,
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `use_client_id` tinyint(1) DEFAULT '0',
  `updated` int(11) DEFAULT NULL,
  `created` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `perm, group_id` (`permission_id`,`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

mysql Workbench 正在运行的查询

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

ALTER TABLE `website`.`Group` 
  ADD CONSTRAINT `fk_Group_Group_Permission1`
  FOREIGN KEY (`id` )
  REFERENCES `website`.`Group_Permission` (`group_id` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

ALTER TABLE `website`.`Group_Permission` 
DROP INDEX `perm, group_id` 
, ADD INDEX `permission_id` (`group_id` ASC) 
, ADD INDEX `group_id` (`group_id` ASC) ;

ALTER TABLE `website`.`Permission` 
  ADD CONSTRAINT `fk_Permission_Group_Permission1`
  FOREIGN KEY (`id` )
  REFERENCES `website`.`Group_Permission` (`permission_id` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

查询创建外键:

New client connection
client connection established
Executing SQL script in server

> ERROR: Error 1005: Can't create table 'website.#sql-3e5_102' (errno:
> 150)


ALTER TABLE `website`.`Group` 
  ADD CONSTRAINT `fk_Group_Group_Permission1`
  FOREIGN KEY (`id` )
  REFERENCES `website`.`Group_Permission` (`group_id` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION

SQL script execution finished: statements: 3 succeeded, 1 failed
4

1 回答 1

1

在我看来,你的人际关系倒退了。 Group_Permission应该包括与 的 FK 关系Group,而不是相反。同样,Group_Permission.permission_id应该引用Permission.id而不是相反。约束无法创建,因为id当您尝试使其成为外键时,它已经是主键。

ALTER TABLE `website`.`Group_Permission` 
  ADD CONSTRAINT `fk_Group_Group_Permission1`
    FOREIGN KEY (`group_id` )
    REFERENCES `website`.`Group` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
  ADD CONSTRAINT `fk_Permission_Group_Permission1`
    FOREIGN KEY (`permission_id` )
    REFERENCES `website`.`Permission` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;
于 2012-06-19T15:01:26.220 回答