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


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

我有用户帐户系统,需要子帐户系统。所以有"主账户"和可以访问主账户数据的账户。我想到的是users表,其中字段"subaccount"为true或false。然后根据"父账户"字段打开来自"父帐户"引用的帐户id的数据。

你觉得怎么样?

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

如果每个帐户只有一个父级,那么这是一个非常直接的实现。您希望创建一个包含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 ;

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

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