sql - 是否有可能添加外键到表引用id列在同一个表

sql - 是否有可能添加外键到表引用id列在同一个表

问题描述:

我有用户帐户系统需要子帐户系统。所以存在可以访问主账户数据的“主账户”和账户。我在想用户表中的字段“subaccount”是true还是false。然后根据“父帐户”字段打开“父帐户”引用的帐户标识数据。sql - 是否有可能添加外键到表引用id列在同一个表

你对此有何感想?

SELECT * FROM users WHERE id = :id 
if("SUBACCOUNT" exists){ 
    SELECT * FROM users WHERE id= :parentaccount 
    echo parentaccounddata 
    $_session['parentaccount'] = false; //restrict certain features 
} 
+0

因此,您有两种类型的帐户,即管理员和用户的子帐户的主帐户。子帐户连接到一个主帐户,并且如果登录人员的帐户是子帐户而非主帐户,则您想要限制权限。我明白了吗? – 2014-09-11 08:40:47

+0

是的。我希望该子账户可以查看并获取主要账户数据。 (之后关闭某些功能) – H3ll1n 2014-09-11 08:55:55

有可能有一个表通过外键约束引用自己的主键(至少它是在MySQL,但我不明白为什么其他的基于SQL数据库不会允许它)。

但是,我想提出替代解决方案。添加将连接帐户的新表格:

CREATE TABLE `accountConnection` (
    `accountId` int NOT NULL, 
    `subAccountId` int NOT NULL, 
    PRIMARY KEY (`accountId`, `subAccountId`), 
    CONSTRAINT `fkAccountId` FOREIGN KEY (`accountId`) REFERENCES `account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `fkSubAccountId` FOREIGN KEY (`subAccountId`) REFERENCES `account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我使用MySQL作为示例。这样,您可以在帐户和子帐户之间建立多种多样的关系,即使您现在不需要它,但我不确定您是否需要解决问题,但却是非常灵活的解决方案,如果您需要改变你的系统以允许它

+0

如果有许多子帐户会怎么样? – H3ll1n 2014-09-12 10:17:30

+0

这个解决方案的最大优点是每个账户都可以成为许多其他账户的“子账户”,同时它可以拥有许多其他账户作为“子账户”。如果帐户ID为1的子帐户的ID为3,5,10,则在连接表中有3行: {accountId:1 subAccountId:3},{accountId:1 subAccountId:5},{accountId :1 subAccountId:10} 每个新帐号/子帐号关系都会在连接表中添加一行 – Ajant 2014-09-12 10:32:19

+0

此外,您还可以通过添加约束条件将每个帐号限制为只有一个超级帐号(它是子帐号的帐号) 'accountConnection'table的'subAccountId'列是唯一的。如果以后你决定删除这个restirction,就像删除一个约束一样简单。您不需要重大更改任何表格 – Ajant 2014-09-12 10:37:10

如果每个帐户只有一个父母,这是一个非常简单的实现。您想要创建一个idparent列的用户表。如果该帐户是主帐户,则可以将parent列设置为NULL。如果它是一个子账户,您可以将其设置为id

表创建

CREATE TABLE IF NOT EXISTS `accounts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    -- other parameters like name, ip, ... 
    `parent` int(11) NULL, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY(`parent`) REFERENCES `accounts`(`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) AUTO_INCREMENT=1 ; 

要检查它是否是一个主帐户或不只是检查父列设置为空或不是。