在mysql中创建表约束

时间:2011-12-07 13:31:44

标签: php mysql sql constraints

我有一个表格,其中我有一些列a,b,c,每列都有另一列,例如(x,y,z),它分别依赖于a,b,c

如果x,y,z具有任何值,则

1将具有值a,b,c,如果a,b,c has null将包含空值。

举个例子让我们说, a中存储的值为2x是依赖于它的列。 因此x的值为1

如果a中存储的值为null,则x的值为null

所以有一种方法可以在表创建时声明这个约束。

请提出除触发器以外的任何建议。

5 个答案:

答案 0 :(得分:7)

如果xyz的目的是简化某些查询,而不是xyz作为您桌面上的列,您还可以考虑使用视图来执行此操作,例如

create view myview as
  select a, b, c,
  if (isnull(a), null, 1) as x,
  if (isnull(b), null, 1) as y,
  if (isnull(c), null, 1) as z
  from mytable;

然后将您的其他查询基于此视图,而不是直接在表格上。

答案 1 :(得分:4)

您要查找的约束是检查约束。

CREATE TABLE test
(
    a varchar(10),
    b varchar(10),
    c varchar(10),
    x integer,
    y integer,
    z integer,
    CONSTRAINT chk_X_Nulls CHECK ((a is null and x is null) or (a is not null and x = 1)),
    CONSTRAINT chk_Y_Nulls CHECK ((b is null and y is null) or (b is not null and y = 1)),
    CONSTRAINT chk_Z_Nulls CHECK ((c is null and z is null) or (c is not null and z = 1))
);

不幸的是这在MySQL中没有实现。有一个open bug report可以追溯到2004年这个功能,所以不要指望很快看到它。

其他人已回答您可以使用触发器或视图来实现所需的结果,这些是MySQL的正确答案。

您还可以使用一些简单的技巧来部分限制数据:

  • x, y, z的数据类型设置为enum('1')。这样可以防止插入null'1'以外的值,但不会确保值正确。
  • 如果a, b, c具有有限范围的可能值,您可以为其他表创建外键约束,并使用a, b, c
  • 的每个可能值填充这些表
  • 您可以按计划创建event更新x, y, z(例如每小时一次或每天一次)。如果错误,可以更正x, y, z的值。

您可以使用PostGreSQL here

查看检查约束

如果您需要进一步的建议,请解释为什么触发器不适合您的任务。

答案 2 :(得分:1)

MySQL本身并不处理CONSTRAINTS,但您可以在BEFORE INSERTBEFORE UPDATE事件上使用TRIGGER实现类似的行为。但是,根据this other question on SO,您将不得不依赖其他一些表级约束(NOT NULL)来使其正常工作。

在您的特定情况下,它看起来很像您希望使用触发器来计算触发器中x, y, z值的值,而不是使用它来防止插入具有“不正确”的数据价值观 - 但你的问题并没有明确说明这一点,所以这取决于你真正想要的东西。

答案 3 :(得分:1)

是的,您可以使用triggers

来自Trigger syntax章节:

  

如果BEFORE触发失败,则不执行相应行的操作

虽然您描述的方案暗示数据未规范化。

答案 4 :(得分:1)

除了约束之外,您可以通过存储所有x,y,z列并使用视图来获得类似的结果:

CREATE VIEW myView AS
SELECT
    a, b, c,
    ( a = a ) AS x,
    ( b = b ) AS y,
    ( c = c ) AS z
FROM myTable