【问题标题】:MySQL Workbench generates combined primary key with unnecessary unique constraintsMySQL Workbench 生成具有不必要唯一约束的组合主键
【发布时间】:2013-09-18 12:16:53
【问题描述】:

我在从 MySQL Workbench 生成我的数据库图的 SQL 过程中遇到问题(在组合主键的每个字段中添加了唯一约束)。

我有下图:https://dl.dropboxusercontent.com/u/3843729/baza.png

此外,它还具有以下属性集:https://dl.dropboxusercontent.com/u/3843729/indexes.png

生成的 SQL:

CREATE TABLE IF NOT EXISTS `test`.`User_has_Menu` (
 `User_id` BIGINT UNIQUE NOT NULL,
 `Menu_id` BIGINT UNIQUE NOT NULL,
PRIMARY KEY (`User_id`, `Menu_id`),
INDEX `fk_User_has_Menu_Menu1_idx` (`Menu_id` ASC),
INDEX `fk_User_has_Menu_User1_idx` (`User_id` ASC),
CONSTRAINT `fk_User_has_Menu_User1`
 FOREIGN KEY (`User_id`)
REFERENCES `test`.`User` (`id`)
 ON DELETE NO ACTION
 ON UPDATE NO ACTION,
CONSTRAINT `fk_User_has_Menu_Menu1`
 FOREIGN KEY (`Menu_id`)
REFERENCES `test`.`Menu` (`id`)
 ON DELETE NO ACTION
 ON UPDATE NO ACTION)
ENGINE = InnoDB;

如您所见,'User_id' 和 'Menu_id' 有 UNIQUE 关键字,因此我无法在两行中插入单个 user_id(或 menu_id),例如:

insert into user_has_menu (user_id, menu_id) values (1,1);
insert into user_has_menu (user_id, menu_id) values (1,3);

第二个插入语句没有被执行,因为 user_id 必须是唯一的。

注意:如果我在 MySQL Workbench 中创建新图表,一切正常,生成的 SQL 没有问题的 UNIQUE 约束。

如何在不创建新图表的情况下移除这些约束?

【问题讨论】:

  • 我是否可以建议您使用自动递增的主键并在user_id, menu_id 上放置一个唯一索引?
  • 这是一种解决方法,但是我想知道为什么它在我的图表中不起作用,并且在新创建的图表中,相同的场景会生成良好的 SQL 代码。此外,我的架构中有很多类似的聚合表,我不想修改它们。

标签: mysql sql mysql-workbench composite-primary-key


【解决方案1】:

首先找到唯一的约束名称:

select * 
from
    information_schema.key_column_usage
where
    and table_schema = 'my_database' 
    and table_name = 'my_table'

然后放下它们

alter table my_table drop index my_contraint

因为unique constraints are handled as indexes on MySQL,您可以尝试确保在 MySQL 图形界面上没有这些索引。

【讨论】:

  • 这只是另一种解决方法,我希望 MySQL Workbench 生成没有这些 UNIQUE 约束的代码。正如您在图片中看到的 (dl.dropboxusercontent.com/u/3843729/indexes.png) 我没有在任何地方指定这些约束。
  • a 可以看到 FK 上的类型索引...看看是否可以删除它,也许尝试编辑表之间的连接。我想我告诉过你尝试在图形界面上删除它们,如果你不能,那么你将不得不手动删除这些约束。
  • 我无法在 GUI 上删除它们。非常奇怪的是,当我创建新图表并放置相同的确切表并创建连接时,SQL 代码不会生成那些 UNIQUE 约束。我知道|我可以手动删除它们,但事实并非如此,因为我希望生成的 SQL 代码正常,因为我正在修改数据库。
  • 是的,请查找附件结果:dropbox.com/s/21xdnffxlh7zxw1/index_delete.png
  • 然后删除 fks,然后添加索引(到要引用的列),然后添加外键。 dev.mysql.com/doc/refman/5.0/en/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多