我有以下表格/创建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;
答案 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