ALTER COLUMN trong sqlite


81

Làm cách nào để thay đổi cột trong sqlite? Đây là trongPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Tôi tin rằng không có ALTER COLUMN trong sqlite, chỉ ALTER TABLE được hỗ trợ.

Bất kỳ ý tưởng? Cảm ơn!


bạn yêu cầu cú pháp ALTER COLUMN, nhưng bạn không nói bạn muốn làm gì. Điều đó khiến tôi nghĩ rằng điều này là quá rộng. ALTER COLUMN có thể làm được nhiều việc, bạn có đang tìm cách loại bỏ ràng buộc not null như trong ví dụ pg không?
Evan Carroll

nếu công cụ intellj db đã sử dụng của bạn, khi bạn thay đổi cột, nó sẽ tạo ra các lệnh cho sqlite của bạn.
ngu ngốc

Câu trả lời:


111

Không có ALTER COLUMN trong sqlite.

Tôi tin rằng lựa chọn duy nhất của bạn là:

  • Đổi tên bảng thành tên tạm thời
  • Tạo một bảng mới mà không có ràng buộc NOT NULL
  • Sao chép nội dung của bảng cũ sang bảng mới
  • Xóa bảng cũ

Câu trả lời Stackoverflow khác này giải thích chi tiết quy trình


64

Mặc dù đúng là không có ALTER COLUMN, nếu bạn chỉ muốn đổi tên cột, bỏ ràng buộc NOT NULL hoặc thay đổi kiểu dữ liệu, bạn có thể sử dụng nhóm lệnh nguy hiểm sau:

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

Bạn sẽ cần đóng và mở lại kết nối của mình hoặc hút bụi cơ sở dữ liệu để tải lại các thay đổi vào giản đồ.

Ví dụ:

Y:\> **sqlite3 booktest**  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> **create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT 
NULL);**  
sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**  
Error: BOOKS.publication_date may not be NULL  
sqlite> **PRAGMA writable_schema = 1;**  
sqlite> **UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT 
NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';**  
sqlite> **PRAGMA writable_schema = 0;**  
sqlite> **.q**  

Y:\> **sqlite3 booktest**  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**  
sqlite> **.q**  

TÀI LIỆU THAM KHẢO SAU:


pragma writeable_schema
Khi bật pragma này, các bảng SQLITE_MASTER trong đó có thể thay đổi cơ sở dữ liệu bằng các câu lệnh UPDATE, INSERT và DELETE thông thường. Cảnh báo: lạm dụng pragma này có thể dễ dàng dẫn đến tệp cơ sở dữ liệu bị hỏng.

[bảng thay đổi] (Từ http://www.sqlite.org/lang_altertable.html )
SQLite hỗ trợ một tập hợp con giới hạn của ALTER TABLE. Lệnh ALTER TABLE trong SQLite cho phép người dùng đổi tên bảng hoặc thêm cột mới vào bảng hiện có. Không thể đổi tên cột, xóa cột hoặc thêm hoặc xóa các ràng buộc khỏi bảng.

TỔNG HỢP BẢNG ALTER


7
Phương pháp này phù hợp với tôi, mặc dù để tránh các trường hợp trong đó các cột có thể có thứ tự khác (tức là từ lệnh ADD COLUMN trước đó), tôi đã sử dụng: UPDATE SQLITE_MASTER SET SQL = Replace (SQL, '[MyColumn] integer NOT NULL' , '[MyColumn] integer NULL') WHERE NAME = 'MyTable'. Ngoài ra, hãy cẩn thận không chạy lệnh này như một phần của giao dịch - nó có thể ngăn một số lệnh giao dịch trước đó chạy.
Ross

32

SQLite hỗ trợ một tập hợp con hạn chế ALTER TABLE. Lệnh ALTER TABLE trong SQLite cho phép người dùng đổi tên bảng hoặc thêm cột mới vào bảng hiện có. Không thể đổi tên cột, xóa cột hoặc thêm hoặc xóa các ràng buộc khỏi bảng. Nhưng bạn có thể thay đổi kiểu dữ liệu cột của bảng hoặc thuộc tính khác bằng các bước sau.

  1. BẮT ĐẦU GIAO DỊCH;
  2. TẠO BẢNG TẠM THỜI t1_backup (a, b);
  3. INSERT INTO t1_backup CHỌN a, b TỪ t1;
  4. DROP BẢNG t1;
  5. TẠO BẢNG t1 (a, b);
  6. CHÈN VÀO t1 CHỌN a, b TỪ t1_backup;
  7. DROP TABLE t1_backup;
  8. CAM KẾT

Để biết thêm chi tiết, bạn có thể tham khảo liên kết .


Để đổi tên bảng: ALTER TABLE table1 RENAME TO table2;
live-love

Đừng quên các chỉ mục. Chạy .schema để tạo câu lệnh tạo với các chỉ mục.
live-love
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.