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不支持检查约束。