Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

AUTO_INCREMENT từ khóa dành riêng cho MySQL.

SQLite có một từ khóa AUTOINCREMENT (không có gạch dưới) có nghĩa là cột tự động tạo các giá trị tăng đơn điệu chưa từng được sử dụng trước đây trong bảng.

Nếu bạn bỏ qua AUTOINCREMENT từ khóa (như tập lệnh bạn hiển thị hiện tại), SQLite chỉ định ROWID cho một hàng mới, có nghĩa là nó sẽ có giá trị 1 lớn hơn ROWID lớn nhất hiện tại trong bảng. Điều này có thể sử dụng lại các giá trị nếu bạn xóa các hàng khỏi cuối bảng và sau đó chèn các hàng mới.

Xem http://www.sqlite.org/autoinc.html để biết thêm chi tiết.

Nếu bạn muốn sửa đổi tập lệnh này để thêm AUTOINCREMENT từ khóa, có vẻ như bạn có thể sửa đổi dòng này:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

Về điều này:

gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )

Re nhận xét của bạn:

Được rồi, tôi đã thử nó trên một bảng giả sử dụng sqlite3.

sqlite> create table foo ( 
  i int autoincrement, 
  primary key (i)
);
Error: near "autoincrement": syntax error

Rõ ràng SQLite yêu cầu autoincrement đó theo cấp cột ràng buộc khóa chính. Nó không hài lòng với quy ước MySQL đặt ràng buộc pk ở cuối, như một ràng buộc cấp bảng. Điều đó được hỗ trợ bởi sơ đồ cú pháp trong SQLite tài liệu cho TẠO BẢNG .

Hãy thử đặt primary key trước autoincrement .

sqlite> create table foo ( 
  i int primary key autoincrement
);
Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY

Và dường như SQLite không thích "INT", nó thích "INTEGER":

sqlite> create table foo (
  i integer primary key autoincrement
);
sqlite>

Thành công!

Vì vậy, tập lệnh awk của bạn không thể dịch bảng DDL của MySQL thành SQLite dễ dàng như bạn nghĩ.

Re nhận xét của bạn:

Bạn đang cố gắng sao chép công việc của mô-đun Perl được gọi là SQL ::Translator , đó là rất nhiều công việc. Tôi sẽ không viết một kịch bản làm việc đầy đủ cho bạn.

Để thực sự giải quyết vấn đề này và tạo một tập lệnh có thể tự động hóa tất cả các thay đổi cú pháp để làm cho DDL tương thích với SQLite, bạn cần triển khai một trình phân tích cú pháp đầy đủ cho SQL DDL. Điều này không thực tế để làm trong awk.

Tôi khuyên bạn nên sử dụng tập lệnh của mình cho một số các trường hợp thay thế từ khóa và sau đó nếu cần thay đổi thêm, hãy sửa chúng bằng tay trong trình soạn thảo văn bản.

Cũng nên cân nhắc việc thỏa hiệp. Nếu quá khó để định dạng lại DDL để sử dụng AUTOINCREMENT trong SQLite, hãy xem xét chức năng ROWID mặc định có đủ gần hay không. Đọc liên kết tôi đã đăng ở trên để hiểu sự khác biệt.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vấn đề backtick Bash + MySQL -d

  2. Chuyển đổi bảng phân biệt chữ hoa chữ thường trong MySQL

  3. CodeIgniter:Cách thực hiện truy vấn MySQL được chọn (Tên trường riêng biệt)

  4. MySQL - Kiểm soát hàng nào được trả về bởi một nhóm bởi

  5. mysql chọn ngày trong phạm vi 30 ngày