簡體   English   中英

在mysql中創建表約束

[英]create table constraint in mysql

我有一個表格,其中我有一些列a,b,c並且對於每列,還有另一列,例如, (x,y,z) ,它們分別依賴於a,b,c

如果a,b,c具有任何值,則x,y,z將具有值1 a,b,c並且如果a,b,c has null ,則將包含a,b,c has null

舉個例子,讓我們說,存儲在a的值是2x是依賴於它的列。 所以x值為1

如果存儲在a值為nullx值為null

那么有沒有一種方法可以在創建表時聲明這個約束。

除了觸發器之外,請提出建議。

如果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;

然后將您的其他查詢基於此視圖,而不是直接在表上。

您要查找的約束是檢查約束。

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'以外的null ,但不能確保值正確。
  • 如果a, b, c具有有限范圍的可能值,則可以為其他表創建外鍵約束,並使用a, b, c每個可能值填充這些表。
  • 您可以創建一個事件來按計划更新x, y, z (例如每小時一次或每天一次)。 如果錯誤x, y, z可以糾正x, y, z的值。

你可以在這里看到PostGreSQL的檢查約束

如果您需要進一步的建議,請解釋為什么觸發器不適合您的任務。

MySQL本身不處理CONSTRAINTS ,但您可以在BEFORE INSERTBEFORE UPDATE事件上使用TRIGGER實現類似的行為。 但是,您將不得不依賴其他一些表級約束( NOT NULL )來使其工作,正如SO上的另一個問題

在您的特定情況下,它看起來很像您希望使用觸發器來計算觸發器中x, y, z值的值,而不是使用它來防止插入具有“不正確”值的數據 - 但是你的問題沒有明確說明這一點,所以這取決於你真正想要的是什么。

是的,您可以使用觸發器

Trigger語法章節:

如果BEFORE觸發器失敗,則不執行相應行的操作

雖然您描述的方案暗示數據未規范化。

除了約束之外,您可以通過存儲所有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM