Ngắn câu chuyện, tôi có tệp SQL mà tôi muốn nhập dưới dạng tệp kiểu skel
, vì vậy việc này sẽ được thực hiện nhiều lần, theo lập trình. Tôi có thể chỉnh sửa các tập tin SQL tuy nhiên tôi muốn, nhưng tôi không muốn chạm vào ứng dụng riêng của mình.Cách buộc MySQL lấy 0 làm giá trị gia tăng tự động hợp lệ
Ứng dụng này sử dụng userid = 0
để đại diện cho người dùng ẩn danh. Nó cũng có một mục có liên quan (trống) trong cơ sở dữ liệu để đại diện cho 'người dùng' này. Do đó, các dòng trong skel.sql
của tôi trông giống như sau:
INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);
Vấn đề với điều này là uid
là một lĩnh vực auto_increment
, mà, về mặt kỹ thuật, 0
là một giá trị không hợp lệ. Hoặc ít nhất, nếu bạn đặt nó là 0, về cơ bản bạn đang nói với MySQL, "Hãy chèn id tiếp theo vào trường này."
Bây giờ, tôi giả sử tôi có thể đặt INSERT
rồi truy vấn UPDATE
vào tệp SQL của mình, nhưng có cách nào nói cho MySQL nói chung là có, tôi thực sự muốn chèn 0
vào trường này?
Một điều bạn phải cẩn thận: 'sql_mode' là danh sách cờ được phân cách bằng dấu phẩy. Nếu bạn làm 'sql_mode = 'NO_AUTO_VALUE_ON_ZERO'', bạn có thể vô tình vô hiệu hóa các cờ khác – Kip
Giải pháp này về cơ bản đã làm việc cho tôi, tuy nhiên kết xuất của tôi cũng bao gồm một số nơi nó ghi đè' sql_mode' ở giữa tệp sql và sau đó đặt lại biến 'OLD_SQL_MODE' đã được đặt để hoàn nguyên về cuối tập lệnh. Điều này đã ghi đè 'NO_AUTO_VALUE_ON_ZERO' của tôi ở giữa tập lệnh của tôi khiến việc này không hoạt động. Giải pháp của tôi là tạo một biến mới của 'INIT_OLD_SQL_MODE' mà tôi đã sử dụng để đặt lại ở cuối và sau khi tôi đặt' sql_mode' thành 'NO_AUTO_VALUE_ON_ZERO', tôi đặt một biến mới' OLD_SQL_MODE' mà những ghi đè tạm thời đó có thể đặt lại thành –