我有以下表格/创建轴:
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;
2条答案
按热度按时间icomxhvb1#
正如您所发现的,myisam不支持外键。两者
users
以及userSettings
必须是innodb。[我]只是好奇在同一列中使用唯一的\u键和外部\u键是否是一种好的做法
这意味着
userSettings
每个表最多只能有一行userId
. 我猜每个userid只需要一行,因为您存储了一个以某种方式编码的设置“数组”settingsArray TEXT
列。这不是一个好的做法。您应该将每个设置存储在自己的列中:
或者每个存储多行
userId
,每行一个设置名称和值。你为什么需要一个
id
列作为主键,如果userId
已经不是null和唯一的,这可能是您用来查找行的键。你可以做userId
主键也是(或userId, setting
在第二个例子中),省略id
列。vohkndzv2#
刚刚意识到对于表用户来说引擎是innodb,而对于usersettings表引擎是myisam,改变了这一点,然后工作了,我只是好奇在同一列中有一个唯一的\u键和一个外部\u键是不是一个好的实践