【问题标题】:Constraint in MYSQL table?MYSQL 表中的约束?
【发布时间】:2012-11-08 16:37:46
【问题描述】:

我有一个名为 Groups 的表格,其中包含primary key = Pkey。在 Group 中有一个递归关联 Parent_group 引用 Pkey 。我将 Parent_Group 定义为关系 Groups 中的外键。我正在使用 MYSQL。

表名:

+------+-----------+------------+----------+---------------+            
| 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 列的新插入行不能有 NULL 值
  2. 添加一个约束,使RootGroup 行不能被删除。

我想知道,天气可能在 SQL 中(如果 yes 怎么样?)或者我必须在后端系统中处理?

可以用触发器吗?

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

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

应该失败

【问题讨论】:

  • 1) 将该字段定义为“非空”。 2) 禁止删除该特定记录的触发器。
  • @Marc B :但是对于RootGroup 的值Parent_group is NULL 怎么办?我可以让它自己引用吗!
  • 是的,将其指向自身,但请确保修改任何递归逻辑以检测到这一点,否则您可能最终会一直旋转以试图找到树的根。
  • @MarcB :如何禁止触发?你能解释一下吗?

标签: mysql sql rdbms database


【解决方案1】:

关于您希望施加的两个约束有几点:

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

    • 只有当列包含所有非空值时,才能对列施加 NOT NULL 约束。您需要在此列中为根节点设置一个空值。
    • 为此,您可以使用 CHECK 约束。阅读更多关于检查约束here
    • 你可以放

检查((peky= AND parent_group 为 NULL)

(peky!= AND parent_group 不为 NULL))

这将只允许根节点使用 NULL 值,并对表中的其他每一行强制使用 NOT NULL 值。

  1. 添加一个约束,使 RootGroup 行不能被删除。

    • 如果您已经在parent_grouppkey 之间定义了一个外键,数据库将自动执行参照完整性并禁止删除根节点(或任何父节点)。如果在任何父节点或根节点上尝试删除,数据库将返回错误。
  2. 对于 EDIT 部分中提到的点,您可以在表上放置一个简单的检查约束,例如
    CHECK (parent_group != pkey)。这应该为您完成这项工作。

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

【讨论】:

  • CHECK 子句被 MySQL 中的所有存储引擎解析但忽略。 [错误报告] (bugs.mysql.com/bug.php?id=25660)
  • 你能在这些行的INSERTUPDATE 上创建一个触发器吗?您可以阅读有关触发器here 的信息。触发器对于数据库的高级审计总是很方便。
  • 对不起,这是 Rachcha,不是 Rachana。我是男生。很高兴你找到了答案。这对我也有帮助。
  • 为您的兴趣投票!谢谢!
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多