【问题标题】:sql - Is it possible to add foreign key to table which references to id colum on the same tablesql - 是否可以将外键添加到引用同一表上的 id 列的表中
【发布时间】:2014-11-05 02:51:27
【问题描述】:

我有用户账户系统,需要子账户系统。所以有“主账户”和可以访问主账户数据的账户。我在想用户表字段“子帐户”是真是假。然后根据“parent-account”字段从“parent-account”引用的account id中打开数据。

您对此有何感想?

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

【问题讨论】:

  • 所以你有两种类型的账户,管理员的主账户和用户的子账户。子账号绑定一个主账号,如果登录人的账号是子账号而不是主账号,你想限制权限。我没听错吗?
  • 是的。我希望该子帐户可以看到并进入主帐户数据。 (然后关闭某些功能)

标签: php mysql account user-accounts


【解决方案1】:

可以通过外键约束让表引用自己的主键(至少在 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 为 1 的帐户具有 ID 为 3、5、10 的子帐户,则连接表中将有 3 行:{accountId: 1 subAccountId: 3}, {accountId: 1 subAccountId: 5}, {accountId: 1 subAccountId: 10} 每一个新的账户/子账户关系都会在连接表中增加一行
  • 此外,您可以通过在accountConnectiontable 的subAccountId 列上添加唯一约束,将每个帐户限制为只有一个超级帐户(它是子帐户的帐户)。如果稍后您决定删除该限制,它就像删除约束一样简单。您无需大幅更改任何表格
【解决方案2】:

如果每个帐户只有一个父帐户,这是一个非常简单的实现。您想创建一个包含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。

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多