繁体   English   中英

sql-是否可以将外键添加到引用同一表上的id colum的表

[英]sql - Is it possible to add foreign key to table which references to id colum on the same table

我有用户帐户系统,需要子帐户系统。 因此,存在“主帐户”和可以访问主帐户数据的帐户。 我在考虑用户表中“子帐户”字段的正确或错误。 然后根据“父帐户”字段从“父帐户”所引用的帐户ID中打开数据。

你觉得这个怎么样?

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

可能有一个表通过外键约束来引用其自己的主键(至少在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为例。 这样,您就可以在帐户和子帐户之间建立多对多关系,我不确定您是否需要从问题中获得这种关系,但这是非常灵活的解决方案,即使您现在不需要,即使您现在不需要更改系统以允许它

如果每个帐户只有一个父母,那将是一个非常简单的实现。 您要创建一个具有id和一个parent列的用户表。 如果该帐户是主帐户,则可以将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 ;

要检查它是否是主帐户,只需检查父列是否设置为NULL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM