Php 在mysql中创建表约束

Php 在mysql中创建表约束,php,mysql,sql,constraints,Php,Mysql,Sql,Constraints,我有一个表,其中有一些列a,b,c,每列有另一列,比如说,(x,y,z),它分别依赖于a,b,c x,y,z如果a,b,c具有任何值,则将具有值1,如果a,b,c具有null,则将包含null 比如说, a中存储的值是2,x是依赖于它的列。 因此x的值为1 如果a中存储的值为null,则x的值为null 那么,有没有一种方法可以在创建表时声明这个约束呢 请建议除触发器以外的任何操作。MySQL本身不处理约束,但您可以在插入前和更新前事件上使用。但是,您必须依赖于其他一些表级约束(notnull)

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

x,y,z
如果
a,b,c
具有任何值,则将具有值
1
,如果
a,b,c具有null
,则将包含null

比如说,
a
中存储的值是
2
x
是依赖于它的列。 因此
x
的值为
1

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

那么,有没有一种方法可以在创建表时声明这个约束呢


请建议除触发器以外的任何操作。

MySQL本身不处理
约束
,但您可以在插入前
和更新前
事件上使用。但是,您必须依赖于其他一些表级约束(
notnull
)才能使其正常工作,如所示

在您非常具体的情况下,您似乎希望使用触发器来计算触发器中的
x,y,z
值,而不是使用它来防止插入具有“不正确”值的数据-但您的问题并没有明确说明这一点,因此这取决于您真正想要的值。

是,你可以用这个

本章:

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


虽然您描述的场景意味着数据不规范。

<代码>,<代码> y>代码>和<代码> z <代码>是为了简化一些查询,而不是< <代码> x>代码>,<代码> y>代码>和<代码> z >代码>作为列在您的表中,您也可以考虑使用视图来执行此操作,例如

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;

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

除了约束之外,您还可以通过存储所有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

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

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中实现。这项功能可以追溯到2004年,所以不要期望很快看到它

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

您还可以使用一些简单的技巧部分约束数据:

  • x,y,z
    的数据类型设置为
    enum('1')
    。这将阻止插入除
    null
    '1'
    以外的值,但无法确保这些值是正确的
  • 如果
    a,b,c
    的可能值范围有限,则可以为其他表创建外键约束,并使用
    a,b,c
  • 您可以创建一个计划来更新
    x、y、z
    (例如每小时一次或每天一次)。如果
    x,y,z
    的值错误,则可以对其进行更正
您可以看到检查约束在PostGreSQL中的作用


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

嘿,谢谢您的回复,但在该表中,有许多地方会发生插入,这是一个巨大的应用程序,我们有两个不同的平台……请您详细说明方法,或提供参考。您好。哪一点不清楚?关于视图的MySQL文档是。伙计们,谢谢你们的回复,但请建议除了触发器以外的任何东西,因为我已经读到,我们可以在create table中设置一些约束。不,你们不能。与大多数其他DBMS(Postgre、Oracle、SQL Server…)不同,MySQL不支持检查约束。