SQL表中的外部ID将一个表链接到另一个表

时间:2016-01-31 13:48:04

标签: mysql

这是我的SQL代码,它根据教程将用户链接到项目:

CREATE TABLE IF NOT EXISTS `users` (
 `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `user_password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `user_email` varchar(254) COLLATE utf8_unicode_ci NOT NULL,
 `user_access_level` tinyint(3) unsigned NOT NULL DEFAULT '0',
 `user_active` tinyint(1) NOT NULL DEFAULT '0',
 `user_activation_hash` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
 `user_password_reset_hash` char(40) COLLATE utf8_unicode_ci DEFAULT NULL,
 `user_password_reset_timestamp` bigint(20) DEFAULT NULL,
 `user_failed_logins` tinyint(1) NOT NULL DEFAULT '0',
 `user_last_failed_login` int(10) DEFAULT NULL,
 `user_registration_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `user_registration_ip` varchar(39) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0.0.0.0',
 PRIMARY KEY (`user_id`),
 UNIQUE KEY `user_name` (`user_name`),
 UNIQUE KEY `user_email` (`user_email`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS `item` (
 `item_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `item_title` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `item_location` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `item_description` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `item_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `item_status` int(1) unsigned NOT NULL,
 PRIMARY KEY (`item_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

http://sqlfiddle.com/#!9/fd011

我对如何将项目链接到用户感到困惑。看起来我需要在项目上使用称为外键的东西,在我的项目表中有点像这样:

FOREIGN KEY (user_id) REFERENCES user(ID)

我似乎无法成功编译和查询。任何人都可以告诉我将项目与用户关联的正确方法。

2 个答案:

答案 0 :(得分:1)

您需要将user_id列与约束一起添加到items表中:

CREATE TABLE IF NOT EXISTS `users` (
 `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `user_password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `user_email` varchar(254) COLLATE utf8_unicode_ci NOT NULL,
 `user_access_level` tinyint(3) unsigned NOT NULL DEFAULT '0',
 `user_active` tinyint(1) NOT NULL DEFAULT '0',
 `user_activation_hash` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
 `user_password_reset_hash` char(40) COLLATE utf8_unicode_ci DEFAULT NULL,
 `user_password_reset_timestamp` bigint(20) DEFAULT NULL,
 `user_failed_logins` tinyint(1) NOT NULL DEFAULT '0',
 `user_last_failed_login` int(10) DEFAULT NULL,
 `user_registration_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `user_registration_ip` varchar(39) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0.0.0.0',
 PRIMARY KEY (`user_id`),
 UNIQUE KEY `user_name` (`user_name`),
 UNIQUE KEY `user_email` (`user_email`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS `item` (
 `item_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  user_id int unsigned,
 `item_title` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `item_location` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `item_description` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `item_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `item_status` int(1) unsigned NOT NULL,
 PRIMARY KEY (`item_id`),
  FOREIGN KEY (user_id) REFERENCES users(user_id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

SQL小提琴是here

我应该指出其他一些事情:

  • 注意您正在使用的数据库引擎。 MyISAM实际上并没有强制执行这种关系。
  • 将奇怪的日期作为默认值可能不如仅使用NULL
  • 我不确定是否有值为每个字符定义都有明确的排序规则,除非您的数据库支持各种排序规则。
  • 不要使用单引号作为数字常量。因此,如果某个值声明为tinyint,请设置默认值0而不是'0'(这不会影响CREATE TABLE语句中的效果;它是只是误导)。

答案 1 :(得分:1)

@ GordonLindoff的解决方案是一种方法,但假设每个项目只属于一个用户,并且多个用户无法引用某个项目。如果您有多对多关系,用户可以拥有多个项目且多个用户可以引用某个项目,那么您需要第三个表格将它们链接在一起:

CREATE TABLE IF NOT EXISTS `user_item` (
  `user_id` int(11) unsigned NOT NULL,
  `item_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`user_item`,`item_id`),
  FOREIGN KEY (user_id) REFERENCES users(user_id),
  FOREIGN KEY (item_id) REFERENCES items(item_id)
)ENGINE=Innodb DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

外键约束强制对user_item中的每一行表示user_id存在于用户中,而item_id存在于items中。正如之前评论中提到的那样,您需要Innodb强制执行外键约束。