2009-12-10 13 views

Trả lời

73

SQLite không hỗ trợ lệnh alter table drop constraint. Bạn sẽ cần phải tạo một bảng mới mà không có một ràng buộc, chuyển dữ liệu, sau đó xóa bảng cũ.

Tôi nghĩ rằng một cái gì đó như sau nên làm việc:

CREATE TABLE child2 ( 
    id INTEGER PRIMARY KEY, 
    parent_id INTEGER, 
    description TEXT 
); 
INSERT INTO child2 (id, parent_id, description) 
    SELECT id, parent_id, description FROM CHILD; 
DROP TABLE child; 
ALTER TABLE child2 RENAME TO child; 

Bạn cũng có thể bỏ qua PARENT_ID từ tất cả các báo cáo trên nếu bạn không muốn nó được chuyển giao.

+0

Khuôn mặt buồn. Đây là những gì tôi đã tìm. Tôi hy vọng rằng tôi đã hiểu lầm về tài liệu 'được thừa nhận'. –

+1

Bạn cũng có thể kết hợp các bước 1 & 2 ở trên vào một câu lệnh sql của câu lệnh sql: "tạo bảng con2 như chọn * từ con;" mặc dù bạn phải thêm ràng buộc PK theo cách thủ công. – chacmool

+1

@chacmool Bạn không thể thêm ràng buộc PK theo cách thủ công sau khi bảng đã được tạo. [Tài liệu SQLite] (https://www.sqlite.org/lang_createtable.html) –

4

Tôi nghĩ rằng đây là một dễ dàng hơn, cách tiếp cận ngắn gọn hơn:

copy db.sqlite3 backup-db.sqlite3 
echo .dump tablename | sqlite3 db.sqlite3 > modify.sql 
(now delete or change the constraint in modify.sql) 
echo drop table tablename; | sqlite3 db.sqlite3 
sqlite3 db.sqlite3 < modify.sql 

Bây giờ bạn có thể redump bảng cơ sở dữ liệu mới và so sánh sự khác biệt.

+1

Trong Linux/sh, bạn có thể cần phải sử dụng 'echo drop table tablename \;'. Chú ý dấu gạch chéo ngược trước dấu chấm phẩy. – jftuga

+1

Hãy xem xét rằng với cách tiếp cận của paxdiablo, bạn có thể đặt toàn bộ hoạt động bên trong một giao dịch sẽ quay trở lại nếu bất kỳ bước nào bị lỗi, để lại db của bạn ở trạng thái ban đầu. Với cách tiếp cận của bạn, bạn sẽ muốn kiểm tra lỗi ở các bước 2, 4 và 5 và hủy bỏ tương ứng, điều này làm cho mã ít ngắn gọn hơn nhiều. –

+0

SQLiteStudio cho phép bạn xuất toàn bộ cơ sở dữ liệu dưới dạng SQL. Điều này cho phép bạn tiến hành giống như jftuga với công cụ dòng lệnh. –