我有一个名为群组的表格primary key = Pkey
。在组中,存在递归关联 Parent_group 引用 Pkey 。我在关系 Groups 中将Parent_Group定义为外键。我正在使用MYSQL。
表bame:群组
+------+-----------+------------+----------+---------------+
| PKey | GroupName | Region | Role | Parent_Group |
+------+-----------+------------+----------+---------------+
| k1 | RootGroup | Jaipur | Admin | NULL |
+------+-----------+------------+----------+---------------+
| k2 | G2 | Alwar | Admin | k1 |
+------+-----------+------------+----------+---------------+
| k3 | G3 | Jaipur | Guest | k3 |
+------+-----------+------------+----------+---------------+
| k4 | G4 | Alwar | Operator| k2 |
+------+-----------+------------+----------+---------------+
查询创建表:
CREATE TABLE IF NOT EXISTS `groups`
(
`PKey` varchar(64) NOT NULL,
`group_name` varchar(64) DEFAULT NULL,
`Region` varchar(128) NOT NULL,
`Role` varchar(128) NOT NULL,
`parent_group` varchar(64) DEFAULT NULL,
PRIMARY KEY (`Pkey`),
KEY `FK_ParentGroup_ChildGroup` (`parent_group`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Groups
表将随我的应用程序一起提供,只有一个RootGroup
元组。
I want to impose two constraints on table?
如下:
Parent_group
列RootGroup
行。 我想知道,在SQL中可以使用Weather(如果yes
如何?)或者我必须在后端系统中处理?
可以使用触发器吗?
编辑:我想在表上施加一个额外的约束,以便新的插入元组不能指向自身。例如
mysql> INSERT INTO Employee VALUES ("8", "H", "BOSS", "8");
Query OK, 1 row affected (0.04 sec)
应该失败?
答案 0 :(得分:1)
您希望强加的两个约束有几点:
新插入的行不能具有Parent_group列的NULL值。
检查((peky = AND parent_group IS NULL)
OR
(peky!= AND parent_group IS NOT NULL))
这将仅允许根节点使用NULL值,并为表中的每个其他行强制执行NOT NULL值。
添加约束,以便无法删除RootGroup行。
parent_group
和pkey
之间定义了外键,数据库将自动强制引用完整性并禁止删除根节点(或任何父节点)。如果在任何父节点或根节点上尝试DELETE,数据库将返回错误。 对于 EDIT 部分中提到的点,您可以在表格上添加一个简单的检查约束
CHECK (parent_group != pkey)
。这应该适合你。
了解如何定义外键约束以及如何使用它们来强制引用完整性。另外,在应用这些建议之前,请浏览我上面发布的链接或here。