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é"; Show
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. Đó 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ềnChú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') LÀ 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 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í') LÀ 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ể nullableNhanh 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' VÀ 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 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. Phần kết luậnChú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àyDấu nhắc SQLViế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 SQLViế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ự
chủ đề liên quan
Bạn cũng có thể thích
|