MYSQL表中的约束?

时间:2012-11-20 15:10:16

标签: mysql sql rdbms database

我有一个名为群组的表格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?如下:

  1. 新插入的行不能具有Parent_group
  2. 的NULL值
  3. 添加约束,以便无法删除RootGroup行。
  4. 我想知道,在SQL中可以使用Weather(如果yes如何?)或者我必须在后端系统中处理?

    可以使用触发器吗?

    编辑:我想在表上施加一个额外的约束,以便新的插入元组不能指向自身。例如

    mysql> INSERT INTO Employee VALUES ("8", "H", "BOSS",   "8");
    Query OK, 1 row affected (0.04 sec)
    

    应该失败

1 个答案:

答案 0 :(得分:1)

您希望强加的两个约束有几点:

  1. 新插入的行不能具有Parent_group列的NULL值。

    • 只有当列包含所有非空值时,才可以对列强加NOT NULL约束。您需要在此列中为根节点使用空值。
    • 为此,您可以使用CHECK约束。阅读有关CHECK CONSTRAINT here的更多信息。
    • 你可以把
  2.   

    检查((peky = AND parent_group IS NULL)
      OR
      (peky!= AND parent_group IS NOT NULL))

    这将仅允许根节点使用NULL值,并为表中的每个其他行强制执行NOT NULL值。

    1. 添加约束,以便无法删除RootGroup行。

      • 您已经在parent_grouppkey之间定义了外键,数据库将自动强制引用完整性并禁止删除根节点(或任何父节点)。如果在任何父节点或根节点上尝试DELETE,数据库将返回错误。
    2. 对于 EDIT 部分中提到的点,您可以在表格上添加一个简单的检查约束 CHECK (parent_group != pkey)。这应该适合你。

    3. 了解如何定义外键约束以及如何使用它们来强制引用完整性。另外,在应用这些建议之前,请浏览我上面发布的链接或here