Mysql 无法在两个表之间创建关系
我有两张桌子:Mysql 无法在两个表之间创建关系,mysql,sql,relation,Mysql,Sql,Relation,我有两张桌子: CREATE TABLE `Users` ( `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(50) NOT NULL DEFAULT '', `last_name` varchar(50) NOT NULL DEFAULT '', `login` varchar(50) NOT NULL DEFAULT '', `password` varchar(50) NO
CREATE TABLE `Users` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) NOT NULL DEFAULT '',
`last_name` varchar(50) NOT NULL DEFAULT '',
`login` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
及
我试图在这两者之间建立一种关系,这样一个用户可能有多本书(user_id),但无论我做什么,我都会出错。或者
无法添加或更新子行:外键约束失败
(书店
)。,
约束books\u fk
外键(user\u id
)引用users
(user_id
)在更新级联时删除级联)
或者之前我没有在Books表中使用unsigned int,我说默认值是0(我更喜欢,但我不认为我可以这么做?),在这种情况下,我得到了错误150。如果您使用的是Mysql,那么您必须使用InnoDB数据库引擎来启用两个表之间的关系 MyISAM不允许这种关系
alter table `users` add constraint `FK_users` FOREIGN KEY (`user_id`) REFERENCES `books` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
也可以使用此查询进行级联编辑删除
alter table `users` add constraint `FK_users` FOREIGN KEY (`user_id`) REFERENCES `books` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
这是两个表的新DDL试试这个
CREATE TABLE IF NOT EXISTS `books` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL DEFAULT '',
`author` varchar(50) NOT NULL DEFAULT '',
`year` int(4) NOT NULL,
`available` int(3) NOT NULL DEFAULT '0',
`availabledate` date NOT NULL,
`user_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) NOT NULL DEFAULT '',
`last_name` varchar(50) NOT NULL DEFAULT '',
`login` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `users`
--
ALTER TABLE `users`
ADD CONSTRAINT `FK_users` FOREIGN KEY (`user_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
请更改这些行,然后重试 将
用户id int(11)无符号非空自动增量更改为用户id
int(11)非空自动增量
及
id
int(11)无符号非空自动递增到id
int(11)非空
零自动增量
及
user\u id
int(11)unsigned NOT NULL,touser\u id
int(11)NOT NULL
最后尝试
CREATE TABLE `Users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) NOT NULL DEFAULT '',
`last_name` varchar(50) NOT NULL DEFAULT '',
`login` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
及
我建议您更改数据库模式。为什么?
一本书可以没有用户而存在吗?如果是,您不应该拥有引用用户的书籍的外键。没有书,用户还能生存吗?如果是,您不应该拥有引用书籍的用户的外键
一个用户可以有多本书吗?一本书有多个用户?如果是,则表示您有m:n关系。这意味着你需要一张桥牌桌
在表中,不需要外键:
CREATE TABLE `Users` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) NOT NULL DEFAULT '',
`last_name` varchar(50) NOT NULL DEFAULT '',
`login` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
CREATE TABLE `Books` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL DEFAULT '',
`author` varchar(50) NOT NULL DEFAULT '',
`year` int(4) NOT NULL,
`available` int(3) NOT NULL DEFAULT '0',
`availabledate` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
桥牌桌看起来像这样:
CREATE TABLE books_users (
book_id int(11) unsigned NOT NULL,
user_id int(11) unsigned NOT NULL,
PRIMARY KEY (book_id, user_id),
KEY idx_user_id (user_id),
FOREIGN KEY fk_books (book_id) REFERENCES Books(id),
FOREIGN KEY fk_users (user_id) REFERENCES Users(user_id)
) ENGINE=InnoDB;
SELECT
whatever
FROM
Books b
INNER JOIN books_users bu ON b.id = bu.book_id
INNER JOIN users u ON bu.user_id = u.user_id
WHERE user_id = 1 /*for example*/
;
这解决了这两个问题,并且是常见的做法
要在一个查询中同时查询用户和书籍,请按如下方式连接它们:
CREATE TABLE books_users (
book_id int(11) unsigned NOT NULL,
user_id int(11) unsigned NOT NULL,
PRIMARY KEY (book_id, user_id),
KEY idx_user_id (user_id),
FOREIGN KEY fk_books (book_id) REFERENCES Books(id),
FOREIGN KEY fk_users (user_id) REFERENCES Users(user_id)
) ENGINE=InnoDB;
SELECT
whatever
FROM
Books b
INNER JOIN books_users bu ON b.id = bu.book_id
INNER JOIN users u ON bu.user_id = u.user_id
WHERE user_id = 1 /*for example*/
;
如果要在表中插入某些内容,只需执行insert操作,并使用SELECT LAST_insert_id()获取为行生成的id即可
,然后将此id插入books\u users
桥接表中
更新不会影响任何东西,您只需在用户
或书籍
上执行即可。如果您真的需要更新auto_increment列(通常不需要也不推荐)您可以在books\u users
表中的外键后添加ON UPDATE CASCADE
。让我检查先生您的定义请检查我添加了新查询以添加编辑和删除关系肯定MyISAM不麻烦?准确地说。MyISAM只是忽略了约束。这种关系不是不允许的!确切地它只是被忽略了。:-)@冯森请考虑我的回答,尽管Chintan Gor有更高的票数。他解决了这个问题,你不能向表中添加外键,但是你的表设计可能仍然是错误的。正如你所说,我创建了一个表,因为事实上我也想让书籍和用户都单独使用。但是你能告诉我如何用这种方式保存和收集信息吗?当我下订单时,我需要更新什么?“什么时候我想展示asd好?”丰森编辑了我的答案。它回答了你的问题吗?