2011-12-07 56 views
6

Tôi có một bảng trong đó có một số cột a,b,c và cho mỗi cột có một cột khác, ví dụ: (x,y,z) phụ thuộc vào số a,b,c tương ứng.tạo ràng buộc bảng trong mysql

x,y,z sẽ có giá trị 1 nếu a,b,c có bất kỳ giá trị nào và sẽ chứa null nếu a,b,c has null.

Ví dụ: Các giá trị được lưu trữ trong a2x là cột phụ thuộc vào nó. Vì vậy, x sẽ có giá trị là 1.

Nếu giá trị được lưu trữ trong anull thì x sẽ có giá trị là null.

có cách nào để chúng tôi có thể tuyên bố ràng buộc này tại thời điểm tạo bảng.

Vui lòng đề xuất bất kỳ điều gì khác ngoài trình kích hoạt.

+0

guys cảm ơn bạn đã phản hồi, nhưng hãy đề xuất bất kỳ điều gì khác ngoài trình kích hoạt, bởi vì tôi đã đọc rằng chúng tôi có thể đặt một số ràng buộc trong việc tạo bảng .. –

+0

Không, bạn không thể. Không giống như hầu hết các DBMS khác (Postgre, Oracle, SQL Server ...) MySQL không hỗ trợ các ràng buộc kiểm tra. –

Trả lời

7

Nếu mục đích của x, yz là để đơn giản hóa một số thắc mắc sau đó thay vì phải x, yz như cột trên bảng của bạn, bạn cũng có thể xem xét sử dụng một cái nhìn để làm ví dụ này

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; 

và sau đó căn cứ các truy vấn khác của bạn trên chế độ xem này thay vì trực tiếp trên bàn.

+0

Cảm ơn bạn đã trả lời ur, nhưng trong bảng đó có rất nhiều nơi chèn diễn ra, nó là một ứng dụng rất lớn và chúng tôi đang có hai nền tảng khác nhau ... –

+0

Bạn có thể vui lòng giải thích cách tiếp cận này hay không? điều này. –

+0

Xin chào. Bit nào không rõ ràng? Tài liệu MySQL trên các khung nhìn là [ở đây] (http://dev.mysql.com/doc/refman/5.6/en/views.html). – mikej

1

MySQL không xử lý CONSTRAINTS mỗi lần, nhưng bạn có thể thực hiện hành vi tương tự bằng cách sử dụng TRIGGER trên các sự kiện BEFORE INSERTBEFORE UPDATE. Tuy nhiên, bạn sẽ phải dựa vào một số ràng buộc mức bảng khác (NOT NULL) để làm cho nó hoạt động, theo this other question on SO.

Trong trường hợp rất cụ thể, có vẻ như bạn muốn sử dụng trình kích hoạt để tính giá trị của các giá trị x, y, z trong trình kích hoạt, thay vì sử dụng nó để ngăn chặn chèn dữ liệu với giá trị "không đúng" - câu hỏi của bạn không làm cho điểm này rõ ràng rõ ràng, vì vậy nó phụ thuộc vào những gì bạn thực sự muốn.

1

Có, bạn có thể sử dụng triggers cho việc này.

Từ chương Trigger syntax:

Nếu kích hoạt TRƯỚC thất bại, hoạt động trên hàng tương ứng không được thực hiện

Mặc dù kịch bản mà bạn mô tả ngụ ý rằng các dữ liệu không phải là bình thường.

1

Bên cạnh những hạn chế, bạn có thể đạt được một kết quả tương tự bởi không lưu trữ tại tất cả các x, y, cột z và sử dụng một cái nhìn:

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

Ràng buộc bạn đang tìm kiếm là ràng buộc kiểm tra.

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)) 
); 

Thật không may điều này không được triển khai trong MySQL. Có một số open bug report có niên đại từ năm 2004 cho tính năng này, do đó, tôi không mong đợi để xem nó bất kỳ lúc nào.

Những người khác đã trả lời rằng bạn có thể sử dụng trình kích hoạt hoặc chế độ xem để đạt được kết quả mong muốn và đây là những câu trả lời đúng cho MySQL.

Bạn cũng có thể phần nào hạn chế dữ liệu của bạn sử dụng một số thủ thuật đơn giản:

  • Đặt loại dữ liệu x, y, z-enum('1'). Điều này sẽ ngăn không cho các giá trị khác ngoài số null'1' nhưng không đảm bảo giá trị là chính xác.
  • Nếu a, b, c có một phạm vi hạn chế về giá trị có thể bạn có thể tạo ràng buộc khoá ngoại để các bảng khác và cư những bảng với tất cả các giá trị có thể có của a, b, c
  • Bạn có thể tạo một event để cập nhật x, y, z theo một lịch trình (ví dụ mỗi giờ một lần hoặc một lần một ngày). Các giá trị cho x, y, z có thể được sửa chữa nếu chúng sai.

Bạn có thể thấy ràng buộc kiểm tra trong hành động với PostgreSQL here

Nếu bạn cần tư vấn thêm xin vui lòng giải thích tại sao trigger không phù hợp với nhiệm vụ của bạn.

Các vấn đề liên quan