Ràng buộc NOT NULL KHÔNG hoạt động trong MySQL

Phil Factor giải thích các vấn đề bạn có thể gặp phải khi thêm cột không thể vô hiệu vào bảng hiện có hoặc thay đổi cột chứa giá trị NULL thành không thể vô hiệu. Anh ấy trình diễn một tập lệnh di chuyển có thể triển khai những thay đổi đó một cách an toàn. Bạn cũng có thể biết rằng trong một dạng cổ xưa của ngôn ngữ Scots, được sử dụng ở Cumberland, số 17 là "kẻ ăn bám nhỏ bé";

Bài của khách

Đây là bài đăng của khách mời từ Phil Factor. Phil Factor (tên thật được giữ lại để bảo vệ kẻ có tội), hay còn gọi là Database Mole, có 30 năm kinh nghiệm với các ứng dụng sử dụng nhiều cơ sở dữ liệu.

Mặc dù đã từng bị Bill Gates giận dữ hét vào mặt tại một cuộc triển lãm vào đầu những năm 1980, ông vẫn kiên quyết ẩn danh trong suốt sự nghiệp của mình.

Anh ấy là người đóng góp thường xuyên cho Simple Talk và SQLServerCentral.

Đó là một nghi thức phổ biến khi thiết kế cơ sở dữ liệu để thêm hoặc loại bỏ các ràng buộc

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1, nhưng có một số vấn đề có thể khiến bạn lo lắng khi thực hiện các thay đổi đối với các bảng đã điền sẵn. Điều này có thể xảy ra khi bạn cố gắng thêm một cột mới không thể chấp nhận các giá trị
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 hoặc thay đổi một cột hiện có, có thể rỗng thành cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1. Dấu nhắc SQL sẽ cảnh báo bạn (EI028) nếu nó phát hiện mã sẽ cố gắng thêm cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 vào bảng hiện có mà không chỉ định giá trị mặc định

Tôi sẽ chứng minh những vấn đề này và sau đó chỉ cho bạn cách phát triển các tập lệnh xây dựng áp dụng các loại thay đổi này. Tôi sẽ chỉ ra cách những thứ này có thể hoạt động bất kể bạn đang xây dựng một phiên bản mới của bảng từ đầu, với các thay đổi hay nếu bạn cần cập nhật một bảng hiện có để nó kết hợp những thay đổi này

Thêm cột NOT NULL vào bảng đã điền

Chúng tôi có một bảng,

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7, trong đó chúng tôi ghi lại các từ dùng để đếm, bằng tiếng Wales Cổ. Chúng tôi có tham vọng đếm đến 20, nhưng hiện tại chỉ biết đếm đến 10

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/* chúng ta tạo một bảng. Ví dụ của chúng tôi, chúng tôi tạo ra các từ

được sử dụng để đếm từ một đến mười ở xứ Wales cũ

(Na, nid wyf yn siaradwr Cymraeg ond rwy'n hoffi gwneud

rhywfaint o ymchwil ieithyddol gyda'r nos)

Cuối cùng tôi cũng muốn làm từ mười một đến hai mươi

vì vậy tôi sẽ thêm chúng và để chúng NULL

Đây là tập lệnh xây dựng ban đầu, với các mệnh đề bảo vệ

Đương nhiên. Chúng tôi sẽ tạo lại mỗi khi nó được chạy

Với một vài sửa đổi, chúng tôi có thể làm cho nó chỉ chạy một lần

sẽ an toàn hơn nếu bạn có những đồng nghiệp liều lĩnh trong cửa hàng của mình

*/

IF Object_Id('dbo. CountingWords') KHÔNG PHẢI NULL DROP TABLE dbo.Số từ;

--we script phiên bản 1 của bảng đếm từ của chúng tôi

TẠO BẢNG dbo. Đếm từ

  (

  Giá trị INT NOT NULL,

  Từ NVARCHAR(30) NULL,

  HÀNG CHẾ Đếm từPK CHÍNH CHÍNH KEY (TheValue)

  );

ĐI

CHÈN VÀO dbo. Đếm từ (TheValue, Từ)

GIÁ TRỊ

  (1, 'Un'),  (2, 'Dau'),  (3, 'Tri'),  (4, 'Pedwar'),

  (5, 'Pump'),  (6, 'Chwech'),  (7, 'Saith'),  (8, 'Wyth'),

  (9, 'Không'),  (10, 'Deg'),  (11, NULL),  (12, NULL),

  (13, NULL),  (14, NULL),  (15, NULL),  (16, NULL),

  (17, NULL),  (18, NULL),  (19, NULL),  (20, NULL);

ĐI

Liệt kê 1. Un, Dau, Tri – phiên bản 1 của bảng CountingWords

Sau khi phát hành phiên bản đầu tiên của bảng này, chúng tôi nhanh chóng nhận ra rằng chúng tôi thực sự nên ghi lại tên của ngôn ngữ, vì vậy chúng tôi thay đổi thiết kế của bảng để thêm cột

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
8, cột này không thể chấp nhận
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1

1

THAY ĐỔI BẢNG dbo. Đếm từ THÊM Ngôn ngữ NVARCHAR(100) NOT NULL;

Ngay lập tức SQL Prompt cảnh báo chúng ta về sự nguy hiểm

Ràng buộc NOT NULL KHÔNG hoạt động trong MySQL

Nếu chúng tôi bỏ qua các cảnh báo của Dấu nhắc SQL và thực hiện điều này, chúng tôi sẽ gặp lỗi

Msg 4901, Level 16, State 1, Line 34
ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'TheLanguage' cannot be added to non-empty table 'CountingWords' because it does not satisfy these conditions.

Thông báo lỗi rõ ràng và có thể dễ dàng khắc phục bằng cách xác định ràng buộc

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 để SQL Server có thể chèn giá trị mặc định cho cột mới này, cho mỗi hàng

1

2

THAY ĐỔI BẢNG dbo. Đếm từ THÊM Ngôn ngữ NVARCHAR(100) NOT NULL

          MẶC ĐỊNH 'Tiếng Wales cổ';

Liệt kê 2. Chỉ định mặc định khi thêm cột NOT NULL

Nói một cách đơn giản, nếu một cột đang được thêm vào và các giá trị

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 không được phép, thì bạn phải cung cấp một giá trị để đặt vào mỗi hàng. Vì bảng của chúng tôi hiện chỉ có một ngôn ngữ, 'old welsh', điều đó không quá khó

Tất nhiên, chúng tôi cũng sẽ muốn ghi lại cách đếm bằng các ngôn ngữ khác, chẳng hạn như tiếng Manx, Cornish hoặc Cumbrian, vì vậy, để thực thi một số tính toàn vẹn của dữ liệu, thay vào đó, chúng tôi cần tạo một bảng cha có tên là

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3 xác định từng ngôn ngữ và

Hãy giải quyết vấn đề đó. Đối với bảng này, chúng tôi không thể xóa và tạo lại bảng mà không làm mất dữ liệu và dù sao thì chúng tôi cũng sẽ gặp lỗi khi bảng

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 của chúng tôi tham chiếu bảng này thông qua ràng buộc
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
5. Chúng ta cần thực hiện các bước phòng ngừa. Tôi sẽ sử dụng một kỹ thuật đơn giản nhưng khá kỳ lạ để đảm bảo không có thiệt hại nào về mặt mất dữ liệu nếu mã được chạy lại. Tập lệnh này bắt buộc phải chạy thành nhiều đợt vì các câu lệnh
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
6
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 phải ở đầu một đợt và rất khó để thực thi mã theo điều kiện giữa các đợt

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

IF Object_Id('dbo. Vị trí') KHÔNG PHẢI NULL SET NOEXEC ON;

--cách xảo quyệt chỉ thực hiện một phần

--của mã trên một điều kiện. cho đến lần tiếp theo SET NOEXEC OFF

--we script phiên bản 1 của bảng đếm từ của chúng tôi

ĐI

--thật đáng buồn là câu lệnh tạo bảng phải ở đầu một đợt

TẠO BẢNG dbo. Vị trí

  (

  Ngôn ngữ NVARCHAR(30) NOT NULL,

  Mô tả VARCHAR(100) NOT NULL DEFAULT '',

  RÀNG BUỘC Khóa ngôn ngữ Khóa CHÍNH Khóa (TheLanguage)

  );

--bây giờ chúng tôi chèn hàng chúng tôi cần cho dữ liệu hiện có của chúng tôi

CHÈN VÀO dbo. Vị trí (Ngôn ngữ) GIÁ TRỊ ('Old Welsh');

ĐI

ĐẶT NOEXEC TẮT;

Liệt kê 3. Phiên bản 1 của bảng Vị trí

Tất nhiên, bây giờ chúng ta cũng cần sửa đổi bảng

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 để cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
8 của nó là một
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
10
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
11, tham chiếu đến bảng
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3 mới, nhưng chúng ta sẽ giải quyết vấn đề đó sau

Thay đổi một cột nullable để làm cho nó không thể nullable

Nhanh chóng, chúng tôi quyết định rằng việc cho phép các giá trị

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 trong cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
14 của
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 là một lỗi thiết kế mà chúng tôi muốn khắc phục. Chúng tôi đã học được rằng, nếu bảng chứa dữ liệu, SQL Server sẽ không cho phép chúng tôi tạo một cột không thể rỗng trừ khi chúng tôi cung cấp giá trị mặc định cho nó, trong trường hợp này chỉ là một chuỗi trống

1

2

ALTER BẢNG Số từ THÊM HÀNG CHẾ WordConstraint DEFAULT '' FOR Word;

ALTER BẢNG Số từ ALTER CỘT Word NVARCHAR(30) NOT NULL;

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.

Liệt kê 4. Không thể tạo cột Word NOT NULL

Aiee. Chúng tôi vẫn không thể làm cho cột không thể rỗng, mặc dù chúng tôi đã cho SQL Server biết cần chèn gì cho cột

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1. Trước tiên, chúng ta phải xóa rõ ràng mọi
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 hiện có bằng cách cập nhật tất cả các hàng bằng giá trị mặc định

1

2

CẬP NHẬT Số từ SET Từ = DEFAULT WHERE Word IS NULL;

ALTER BẢNG Số từ ALTER CỘT Word NVARCHAR(30) NOT NULL;

Liệt kê 5. Cập nhật các hàng hiện có với giá trị mặc định trước khi tạo cột NOT NULL

Vì vậy, điều đó đã làm việc tốt

Triển khai tất cả các thay đổi

Đã đến lúc triển khai tất cả những thay đổi này cho những người chỉ có phiên bản 1 của thiết kế, nơi không có bảng

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3 và nơi
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 không có cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
8 và cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
11 có thể null

Triển khai bảng

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3 mới, vì đây là phiên bản đầu tiên của bảng đó, không có vấn đề gì thực sự (xem Liệt kê 3). Tuy nhiên, việc triển khai các thay đổi đối với bảng
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 mới yêu cầu thêm cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
14, cột này không cho phép các
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 và thay đổi cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
11 thành
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1, trong cả hai trường hợp đều tránh được các sự cố mà chúng ta đã thảo luận

Chúng tôi cũng muốn tập lệnh di chuyển của mình hoạt động bất kể chúng tôi đang cập nhật phiên bản 1 hiện có của

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 hay chúng tôi cần xây dựng phiên bản 2 của bảng từ đầu. Ngoài ra, chúng tôi không muốn tập lệnh gây ra bất kỳ tác hại nào hoặc gây ra lỗi nếu tập lệnh vô tình chạy lại

Như một phần thưởng, trong cả hai trường hợp, chúng tôi cũng sẽ cần tạo cột

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
14 trong
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 thành
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
10
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
11 tự động cập nhật để phản hồi các cập nhật hoặc xóa trên khóa gốc, cũng như thay đổi
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
34
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
11. Bước cuối cùng, chúng tôi sẽ thêm các từ tiếng Wales cổ cho 11-20, mà trước đây chúng tôi không biết

Đây là tập lệnh di chuyển sẽ di chuyển

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 từ v1 sang v2 hoặc tạo v2 từ đầu và sẽ không gây hại nếu vô tình chạy lại. Trước khi bạn thử, hãy bỏ bảng
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
7 hoặc chạy lại Liệt kê 1 để thiết lập lại v1 của bảng

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

--chúng tôi bây giờ kịch bản phiên bản 2

IF Object_Id('dbo. CountingWords') IS NULL

  BẮT ĐẦU

    --chúng tôi viết phiên bản 2 của bảng đếm từ nếu nó

   --không tồn tại

    TẠO BẢNG dbo. Đếm từ

      (

      Giá trị INT NOT NULL,

      Từ NVARCHAR(30) NOT NULL CONSTRAINT WordConstraint DEFAULT '',

      Ngôn ngữ NVARCHAR(30) NOT NULL

        RÀNG BUỘC Ràng buộc về ngôn ngữ TÀI LIỆU THAM KHẢO dbo.Vị trí(Ngôn ngữ)

          BẬT XÓA CASCADE

          BẬT CẬP NHẬT CASCADE

       HÀNG CHẾ CountingWordsPK CHÍNH CHÍNH KEY(TheValue, TheLanguage)

      );

  END;

KHÔNG CÓ /* nếu không, chúng tôi cần thêm một cột và thay đổi khóa chính

hạn chế */

  BẮT ĐẦU

    NẾU KHÔNG TỒN TẠI -- chỉ chạy nếu

      (

      CHỌN *   TỪ sys.cột

        WHERE name THÍCH 'TheLanguage'

           object_id = Object_Id('dbo.CountingWords')

      )

      BẮT ĐẦU

        -- trước tiên, chúng tôi cần thêm cột ngôn ngữ

        ALTER BẢNG Số từ THÊM TheLanguage NVARCHAR(30) NOT NULL

          MẶC ĐỊNH 'Tiếng Wales cổ' RÀNG BUỘC Ràng buộc ngôn ngữ

            TÀI LIỆU THAM KHẢO dbo. Vị trí(Ngôn ngữ)

             BẬT XÓA CASCADE

             BẬT CẬP NHẬT CASCADE ;

      END

       --bây giờ chúng ta cần thay đổi khóa chính

      ALTER BẢNG Số từ DROP CONSTRAINT CountingWordsPK;

      ALTER TABLE CountingWords --và thêm từ mới

        THÊM HÀNG CHẾ Đếm từPK

          PRIMARY KEY(TheValue, TheLanguage);

      NẾU KHÔNG TỒN TẠI -- chúng ta có cần

        (CHỌN * TỪ sys.default_constraint

          WHERE name THÍCH 'WordConstraint')

        BẮT ĐẦU

          ALTER BẢNG Số từ THÊM CONSTRAINT WordConstraint DEFAULT '' FOR Word;

/* Bạn chỉ có thể chỉ định NOT NULL trong ALTER COLUMN nếu cột không chứa giá trị null

Các giá trị null phải được cập nhật thành một giá trị nào đó trước khi cho phép ALTER COLUMN NOT NULL,*/

          CẬP NHẬT Đếm Từ ĐẶT Từ = DEFAULT WHERE Word IS NULL;

        END;

    NẾU KHÔNG TỒN TẠI --giờ đây cuối cùng chúng ta cũng có thể

        (CHỌN * TỪ sys.cột

           WHERE name THÍCH 'word' AND is_nullable = 0)    

       ALTER BẢNG Số từ ALTER COLUMN Word NVARCHAR(30) NOT NULL;

  END;

ĐI

NẾU TỒN TẠI --chúng ta có cần thêm những từ tiếng Wales mà chúng ta không biết không

  (CHỌN * TỪ dbo.Đếm từ

  WHERE Ngôn ngữ THÍCH 'Tiếng Wales cổ' AND word LIKE ''

  )

  --có, chúng tôi cần thêm những từ đó để thay thế những khoảng trống khó chịu đó

  CẬP NHẬT Số từ

    SET Từ = welsh.từ

    TỪ Đếm từ AS cw

      INNER THAM GIA

        (

        GIÁ TRỊ ('Un ar ddeg',< 11), ('Deuddeg', 12), ('Tri ar ddeg', 13),

          ('Pedwar ar ddeg', 14<), ('Pymtheg', 15), ('Un ar bymtheg', 16),

          ('Dau ar bymtheg', 17<), ('Deunaw', 18), ('Pedwar ar bymtheg', 19),

          ('Ugain', 20)

        ) AS welsh (word, meaning)

       BẬT welsh. ý nghĩa = cw. Giá trị;

Liệt kê 6. Tập lệnh di chuyển an toàn cho v2 của CountingWords

Nếu không cố gắng đảm bảo rằng tập lệnh di chuyển hoạt động trong mọi trường hợp, thì mọi việc đã đơn giản hơn rất nhiều. Tôi chỉ ghét các tập lệnh xây dựng chỉ có thể chạy trong các trường hợp cụ thể

Bây giờ chúng ta hãy kiểm tra bằng cách thêm các từ đếm từ một đến hai mươi bằng một ngôn ngữ/khu vực khác

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

KHAI BÁO @Ngôn ngữ NVARCHAR(30) = 'West Cumbrian';

NẾU KHÔNG TỒN TẠI

  (CHỌN * TỪ dbo.Vị trí

  WHERE Ngôn ngữ THÍCH @Language

  ) CHÈN VÀO dbo.Vị trí (Ngôn ngữ)

      GIÁ TRỊ (@Ngôn ngữ);

/* và bây giờ chúng ta có thể thêm bất kỳ cách nào khác để đếm đến

hai mươi mà chúng tôi muốn */

NẾU KHÔNG TỒN TẠI (CHỌN * FROM CountingWords WHERE Thelanguage LIKE @Language)

CHÈN VÀO Số từ (Giá trị, Word, TheLanguage)

  CHỌN Giá trị, từ, @Language

    TỪ

      (

      GIÁ TRỊ ('yan', 1), ('tyan', 2), ('tethera', 3), ('methera', 4),

        ('ma cô', 5), ('sethera', 6), ('lethera', 7), ('hovera', 8),

        ('dovera', 9), ('dick', 10), ('yan-a-dick', 11), ('tyan-a-dick', 12),

        ('tethera-dick', 13<), ('nethera-dick', 14), ('bumfit', 15),

        ('yan-a-bumfit', 16), ('tyan-a-bumfi t', 17), ('tithera-bumfit', 18),

        ('methera-bumfit', 19<), ('giggot', 20)

      ) AS f (word, TheValue);

ĐI

Liệt kê 7. Yan, Tyan, Tethera – đếm đến 20 ở Tây Cumbria

Bây giờ tôi đã thay đổi suy nghĩ của mình. Nó không nên được gọi là 'Tiếng Wales cổ', mà là 'Tiếng Wales cổ'. Thật đáng tiếc, nhưng bây giờ chúng ta có thể kiểm tra ràng buộc khóa ngoại của mình

1

2

3

CẬP NHẬT dbo. Vị trí SET Ngôn ngữ = ' WHERE TheLanguage LIKE 'Old Welsh'

CHỌN * TỪ vị trí

CHỌN * TỪ Số từ

Liệt kê 8. Xếp tầng cập nhật sau khi thay đổi ngôn ngữ

Như thể bằng phép thuật, tất cả các tài liệu tham khảo đã thay đổi. Bây giờ tôi có một cơ sở dữ liệu tôi có thể sử dụng

Ràng buộc NOT NULL KHÔNG hoạt động trong MySQL

Tôi đã cung cấp một tập lệnh FillCountingWordsTable, chứa một tập hợp đầy đủ các từ đếm cho nhiều loại 47 vị trí và ngôn ngữ được ghi lại mà bạn có thể sử dụng để thử nghiệm rộng rãi hơn. Xin lỗi bạn bè và người thân ở Hoa Kỳ rằng tôi đã bỏ qua một số bộ lạc da đỏ đã sử dụng các vần đếm giống nhau. Qua điều tra, hóa ra họ đã được thực dân Anh dạy đan len và họ nghĩ rằng những từ dùng để đếm các mũi khâu là một phần của phép thuật.

Ràng buộc NOT NULL KHÔNG hoạt động trong MySQL

Phần kết luận

Chúng tôi vừa thiết lập một minh họa khá phức tạp về cách tránh một số vấn đề khi thay đổi các bảng đã được điền sẵn dữ liệu. Trong ví dụ này, các vấn đề liên quan đến việc sử dụng các giá trị

Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 và xảy ra khi bạn cố gắng thêm một cột mới không thể chấp nhận các giá trị
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 hoặc thay đổi một cột hiện có, có thể rỗng thành một cột
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
3
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1, khi có sẵn các
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 . Trong trường hợp đầu tiên, trước tiên, bạn chỉ cần thêm ràng buộc
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 vào cột, với giá trị không phải là
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 và trong trường hợp thứ hai, trước tiên, bạn xóa giá trị
Msg 515, Level 16, State 2, Line 58
Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
1 bằng cách cập nhật bảng

Đây là những kỹ thuật để thực hiện các thay đổi đối với các bảng hiện có, đó là lý do tại sao tôi xây dựng phần trình diễn để minh họa cách thực hiện cả hai thao tác này như một phần của tập lệnh đàn hồi có thể chạy bất kể đó là bản dựng mới hay bản di chuyển.

Bài viết này hữu ích không?

Vâng, cảm ơn Không thực sự

Công cụ trong bài viết này

Dấu nhắc SQL

Viết, định dạng và cấu trúc lại SQL một cách dễ dàng

Tìm hiểu thêm

Dấu nhắc SQL

Viết, định dạng và cấu trúc lại SQL một cách dễ dàng

Tìm hiểu thêm

Những sảm phẩm tương tự

  • Đường bay
  • Tự động thay đổi SQL
  • Trình tạo dữ liệu SQL
  • Màn hình SQL
  • Kiểm tra SQL
  • Đai công cụ SQL

chủ đề liên quan

  • Kiểm tra cơ sở dữ liệu
  • Hiệu suất truy vấn
  • Hoàn thành mã SQL và IntelliSense
  • Đoạn mã SQL
  • Định dạng và kiểu SQL
  • Tái cấu trúc SQL
  • Quản lý tab SSMS

Bạn cũng có thể thích

  • Mạo từ

    Cách chúng tôi sử dụng phản hồi của bạn để cải thiện định dạng dấu ngoặc đơn trong SQL Prompt 8. 1

    Sau khi chúng tôi phát hành SQL Prompt 8, ưu tiên của chúng tôi là tiếp tục hỗ trợ công cụ định dạng mới bằng cách sửa bất kỳ lỗi nào và xem xét phản hồi từ người dùng. Một trong những mẫu định kỳ mà chúng tôi nhận thấy trong phản hồi của bạn liên quan đến định dạng dấu ngoặc đơn. Một số bạn nói với chúng tôi rằng bạn không thể định dạng dấu ngoặc chính xác theo cách bạn muốn

  • Mạo từ

    Đá quý ẩn dấu nhắc SQL. Tự động điền mệnh đề GROUP BY

    Viết các mệnh đề

    Msg 515, Level 16, State 2, Line 58
    Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
    The statement has been terminated.
    16
    Msg 515, Level 16, State 2, Line 58
    Cannot insert the value NULL into column 'Word', table 'PhilFactor.dbo.CountingWords'; column does not allow nulls. UPDATE fails.
    The statement has been terminated.
    17 là một hoạt động rất phổ biến nhưng tẻ nhạt đối với một lập trình viên SQL. Dấu nhắc SQL sẽ điền vào cho bạn, với tất cả các cột không tổng hợp được trả về bởi truy vấn

  • Mạo từ

    Tạo và duy trì thư viện đoạn mã SQL

    Cách lưu tất cả các loại đoạn mã SQL khác nhau của bạn trong thư viện trung tâm của Bộ sưu tập đoạn mã JSON, nơi bạn có thể tìm kiếm và chỉnh sửa từng bộ sưu tập, sau đó viết chúng ra dưới dạng các đoạn mã riêng lẻ, để sử dụng trong Dấu nhắc SQL, SSMS hoặc khay nhớ tạm của lập trình viên của bạn

  • Mạo từ

    Phân tích mã SQL từ tập lệnh triển khai PowerShell

    Bài viết này cho biết cách xác định các quy tắc phân tích mã SQL bằng SQL Prompt và chúng tự động chạy chúng từ tập lệnh PowerShell, hiển thị các vấn đề về mã được phát hiện trong một báo cáo HTML tiện dụng

    NOT NULL không hoạt động trong MySQL?

    Theo mặc định, một cột có thể chứa giá trị NULL. Ràng buộc NOT NULL buộc cột KHÔNG chấp nhận giá trị NULL . Điều này buộc một trường phải luôn chứa một giá trị, nghĩa là bạn không thể chèn bản ghi mới hoặc cập nhật bản ghi mà không thêm giá trị vào trường này.

    Làm cách nào để nhận các giá trị KHÔNG NULL trong MySQL?

    Ví dụ - Với câu lệnh SELECT . CHỌN * TỪ danh bạ WHERE last_name KHÔNG NULL; Ví dụ MySQL IS NOT NULL này sẽ trả về tất cả các bản ghi từ bảng danh bạ nơi last_name không chứa null .

    KHÔNG NULL NULL SQL?

    Điều kiện IS NOT NULL được sử dụng trong SQL để kiểm tra giá trị không phải NULL . Nó trả về TRUE nếu tìm thấy giá trị không NULL, ngược lại nó trả về FALSE. Nó có thể được sử dụng trong câu lệnh SELECT, INSERT, UPDATE hoặc DELETE.

    Quy tắc ràng buộc NOT NULL là gì?

    Ràng buộc NOT NULL được sử dụng để đảm bảo rằng một cột nhất định của bảng không bao giờ được gán giá trị null . Khi một ràng buộc NOT NULL đã được xác định cho một cột cụ thể, mọi thao tác chèn hoặc cập nhật cố gắng đặt một giá trị null vào cột đó sẽ không thành công.