mysql唯一键和外键同一列无法创建

nr9pn0ug  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(376)

我有以下表格/创建轴:

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表时它没有创建外键,create轴有什么问题吗?它与为同一列创建两个索引有关?
以下是创建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;
icomxhvb

icomxhvb1#

正如您所发现的,myisam不支持外键。两者 users 以及 userSettings 必须是innodb。
[我]只是好奇在同一列中使用唯一的\u键和外部\u键是否是一种好的做法
这意味着 userSettings 每个表最多只能有一行 userId . 我猜每个userid只需要一行,因为您存储了一个以某种方式编码的设置“数组” 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`)
)

你为什么需要一个 id 列作为主键,如果 userId 已经不是null和唯一的,这可能是您用来查找行的键。你可以做 userId 主键也是(或 userId, setting 在第二个例子中),省略 id 列。

vohkndzv

vohkndzv2#

刚刚意识到对于表用户来说引擎是innodb,而对于usersettings表引擎是myisam,改变了这一点,然后工作了,我只是好奇在同一列中有一个唯一的\u键和一个外部\u键是不是一个好的实践

相关问题