2011-07-31 22 views

Trả lời

5

Nếu bạn đang sử dụng ALTER TABLE với RENAME TO để đổi tên một bảng, sau đó như mô tả trên this page (từ các tài liệu SQLite) các chỉ số sẽ vẫn làm việc:

Câu lệnh ALTER TABLE lệnh trong SQLite cho phép người dùng đổi tên một bảng [...] Nếu bảng đang được đổi tên có trình kích hoạt hoặc chỉ mục, thì các bảng này vẫn được gắn vào bảng sau khi nó được đổi tên.

Nhưng lưu ý rằng không đổi tên cột được phép. Đây là một trong số SQL features not implemented by sqlite:

Chỉ các biến thể RENAME TABLE và ADD COLUMN của lệnh ALTER TABLE mới được hỗ trợ. Các loại hoạt động ALTER TABLE khác như DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT, v.v. được bỏ qua.

Hàng không có tên (ngoại trừ ý nghĩa có PK) nên không thực sự có cách đổi tên chúng.

+0

Có cách nào để sao chép thông tin từ cột này sang cột khác, sau đó xóa cột đầu tiên không? – joshim5

+0

Xem [câu hỏi SO khác] (http://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table) về cách đổi tên cột –

+0

Tôi đã thực sự chỉ cần nhìn qua đó :). Câu trả lời đầu tiên có vẻ tuyệt vời, nhưng làm thế nào tôi nên đối phó với các chỉ số? – joshim5

0

Tôi đặc biệt khuyên bạn nên sử dụng di chuyển Rails ActiveRecord để duy trì cơ sở dữ liệu của bạn. Điều này có thể được thực hiện bên ngoài Rails. Vì vậy, bạn ứng dụng không cần phải là một ứng dụng Rails sử dụng nhiệm vụ cào

Xem ở đây cho một blog tuyệt vời về cách để làm điều này http://exposinggotchas.blogspot.com/2011/02/activerecord-migrations-without-rails.html

0

Vâng, các chỉ số cũ sẽ vẫn được chức năng.

Xin lưu ý rằng sqlite đó không quan tâm đến tên của các chỉ mục. Ban đầu khi một chỉ mục được tạo thường thì chúng được đặt tên theo bảng và trường, vì vậy khi bạn đổi tên bảng, các chỉ mục sẽ vẫn có tên của bảng cũ trong bảng đó. Điều này có thể gây ra vấn đề, khi bạn ví dụ:

  • đổ bảng
  • đổi tên bảng cũ:

    sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'" 
    
  • tái nhập khẩu bảng đổ

Điều này sẽ gây ra một lỗi , các chỉ mục đã tồn tại.

Giải pháp: Đổi tên các chỉ mục quá, hoặc xóa chúng trong bảng đã đổi tên trước khi bạn nhập lại bản gốc (xem this answer).

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