2013-02-26 62 views
0

是否有可能在mysql中像这样创建表? 如果是,请用表格中的样本数据解释我(当我们首次插入时,表格中的值是什么)。在mysql中的Db架构

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

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

我从Google文档中获得了这个数据库模式。

注:关系是1..1

enter image description here

回答

1

通过关闭外键检查,您可以在架构内以任意顺序创建表。

例如,下面我创建一个BannedUsers表,在Users表上创建一个外键,但尚未创建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; 
0

这是不可能的。原因很简单

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

同样,如果您首先创建订户表,您将需要用户表格架构,由于上述原因再次不可能。另外,如果你以某种方式定义了两个表格,将来可能会以高度不一致的db结束,因为从1表格中删除行会导致由于FK限制造成的其他数据不一致。

+0

我也不确定。我从http://code.google.com/p/hss/获取了此架构 – 2013-02-26 08:26:26