MySQL UNIQUE KEY和FOREIGN KEY同一列未创建

时间:2018-11-15 20:49:39

标签: mysql foreign-keys unique-key

我有以下表格/创建sintaxis:

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parentId` int(10) unsigned DEFAULT NULL,
  `fullName` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `alias` varchar(35) COLLATE utf8_unicode_ci DEFAULT NULL,
  `username` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  UNIQUE KEY `uk_parentId_fullName_alias` (`parentId`,`fullName`,`alias`),
  KEY `fk_users_parentId` (`parentId`),
  CONSTRAINT `fk_users_parentId` FOREIGN KEY (`parentId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `userSettings` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `userId` int(11) unsigned NOT NULL,
  `settingsArray` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_userId` (`userId`),
  KEY `fk_userSettings_userId` (`userId`),
  CONSTRAINT `fk_userSettings_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
我试图用用户数据创建一个表,用用户设置创建另一个表,当我创建userSettings表时,它没有创建外键,创建sintaxis是否有问题?它与为同一列创建两个索引有关?

这是创建userSettings表后得到的信息:

CREATE TABLE `userSettings` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `userId` int(11) unsigned NOT NULL,
  `settingsArray` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_userId` (`userId`),
  KEY `fk_userSettings_userId` (`userId`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

2 个答案:

答案 0 :(得分:2)

如您所见,MyISAM不支持外键。 def add_letter(): if len(tiles_letters) > 0: tile_frame = Label(frame, text=tiles_letter.pop()) tile_frame.pack() root.after(500, add_letter) users都必须是InnoDB。

  

[我很好奇,如果在同一列中有UNIQUE_KEY和FOREIGN_KEY是一个好习惯

这意味着userSettings表每个userSettings最多可以有一行。我猜您每个userId只需要一行,因为您在userId列中存储了以某种方式编码的设置的“数组”。 This is not a good practice.

您应该将每个设置存储在其自己的列中:

settingsArray TEXT

否则,每CREATE TABLE `userSettings` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `userId` int(11) unsigned NOT NULL, `isAdmin` bool NOT NULL, `timezone` varchar(10) NOT NULL, `theme` varchar(10) NOT NULL, ...other settings... PRIMARY KEY (`id`), UNIQUE KEY `uk_userId` (`userId`), KEY `fk_userSettings_userId` (`userId`) ) 存储多行,每行具有一个设置名称和值。

userId

如果CREATE TABLE `userSettings` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `userId` int(11) unsigned NOT NULL, `setting` varchar(20) NOT NULL, `value` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_userId` (`userId`,`setting`), KEY `fk_userSettings_userId` (`userId`) ) 已经不是NOT NULL和UNIQUE了,为什么还需要一个id列作为主键,这也很令人困惑,这可能是您无论如何都要用来查找行的键。您也可以将userId设置为主键(或在第二个示例中为userId),并省略userId, setting列。

答案 1 :(得分:1)

对于表用户,刚意识到ENGINE是InnoDB,对于用户设置表ENGINE是MyISAM,对此进行了更改并起作用,只是很好奇在同一列中是否有UNIQUE_KEY和FOREIGN_KEY