0

是否可以在mysql中创建这样的表?如果是,请用表格中的示例数据向我解释(当我们第一次插入时表格中的值是什么)。

Subscriber
------------
SubscriberId: guid() <<pk>>
privateUserIDs string <<fk>>
value1 string
...

User
----
privateUserIDs string <<pk>>
SubscriberId: guid() <<fk>>
value2 string
...

我从谷歌文档中得到了这个数据库模式。

注意:关系是 1..n

在此处输入图像描述

4

2 回答 2

1

通过关闭外键检查,您可以在模式中以任何顺序创建表。

例如,下面我在 Users 表上创建了一个带有外键的 BannedUsers 表,但尚未创建 Users 表。

之后,请务必再次启用外键检查。

下面的示例已经使用 InnoDB 引擎在 MySQL 5.5.31 数据库上进行了测试。

SET FOREIGN_KEY_CHECKS=0;

CREATE TABLE IF NOT EXISTS `BannedUsers` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(10) unsigned NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`),
  KEY `FK_BannedUsers_Users` (`user_id`),
  CONSTRAINT `FK_BannedUsers_Users` FOREIGN KEY (`user_id`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `Users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(254) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `firstname` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `lastname` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

SET FOREIGN_KEY_CHECKS=1;
于 2013-05-11T14:48:54.830 回答
0

这不可能。原因很简单

如果您首先创建用户表,那么在描述它的模式表时订阅者必须存在,因为您需要在用户表中引用订阅者表的 PK 来创建 FK。

同样,如果您首先创建订阅者表,您将需要用户表模式,由于上述原因,这又是不可能的。

此外,如果您以某种方式定义了两个表,那么您将来可能会得到高度不一致的 db,因为从 1 个表中删除行会由于 FK 约束而导致其他表中的数据不一致。

于 2013-02-26T07:04:00.533 回答