Php sql-是否可以向引用同一表上id列的表添加外键

Php sql-是否可以向引用同一表上id列的表添加外键,php,mysql,account,user-accounts,Php,Mysql,Account,User Accounts,我有用户帐户系统,需要子帐户系统。因此,有“主帐户”和可以访问主帐户数据的帐户。我在想用户表中字段“subaccount”是真是假。然后根据“父帐户”字段打开“父帐户”引用的帐户id中的数据 你觉得怎么样 SELECT * FROM users WHERE id = :id if("SUBACCOUNT" exists){ SELECT * FROM users WHERE id= :parentaccount echo parentaccounddata $_session[

我有用户帐户系统,需要子帐户系统。因此,有“主帐户”和可以访问主帐户数据的帐户。我在想用户表中字段“subaccount”是真是假。然后根据“父帐户”字段打开“父帐户”引用的帐户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
列设置为空即可。如果是子帐户,您可以将其设置为
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。

因此您有两种类型的帐户,管理员的主帐户和用户的子帐户。子帐户连接到一个主帐户,如果登录人员的帐户是子帐户而不是主帐户,则您希望限制权限。我明白了吗?是的。我希望子帐户可以看到并进入主帐户数据。(之后关闭某些功能)此解决方案的最大优点是,每个帐户都可以是许多其他帐户的“子帐户”,同时它可以有许多其他帐户作为“子帐户”。如果id为1的帐户具有id为3、5、10的子帐户,则在连接表中有3行:{accountId:1 subAccountId:3},{accountId:1 subAccountId:5},{accountId:1 subAccountId:10}每个新帐户/子帐户关系都会在连接表中添加一行。此外,您可以通过在
accountConnection
表的
subaccountd
列中添加唯一约束,将每个帐户限制为只有一个超级帐户(它是子帐户的帐户)。如果以后您决定删除该重新循环,则只需删除一个约束即可。您无需对任何表进行重大更改