Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 无法在两个表之间创建关系_Mysql_Sql_Relation - Fatal编程技术网

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,to
user\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好?”丰森编辑了我的答案。它回答了你的问题吗?