อืม ... สำหรับปีที่ไม่มีใครพูดถึงสิ่งหนึ่งที่บอบบาง
แม้จะDROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );
ดูสมเหตุสมผล แต่มันก็นำไปสู่สถานการณ์เมื่อโต๊ะเก่าหายไปแล้วและยังไม่ได้สร้างโต๊ะใหม่: ลูกค้าบางคนอาจพยายามเข้าถึงตารางหัวเรื่องได้ในขณะนี้
วิธีที่ดีกว่าคือการสร้างตารางใหม่และสลับกับตารางเก่า (เนื้อหาตารางหายไป):
CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
- คุณควรตรวจสอบผลลัพธ์ของ
CREATE ...
และไม่ดำเนินการต่อในกรณีที่เกิดข้อผิดพลาดเนื่องจากความล้มเหลวหมายความว่าเธรดอื่นไม่ได้ทำสคริปต์เดียวกัน: เนื่องจากมันล้มเหลวตรงกลางหรือเพิ่งเสร็จไม่ได้ - เป็นความคิดที่ดี ตรวจสอบสิ่งต่าง ๆ ด้วยตัวเอง
- จากนั้นคุณควรตรวจสอบผลลัพธ์ก่อน
RENAME ...
และไม่ดำเนินการต่อในกรณีที่ประสบความสำเร็จการดำเนินการทั้งหมดเสร็จสมบูรณ์ ยิ่งกว่านั้นการเรียกใช้งานถัดไปRENAME ...
สามารถ (และจะ) ไม่ปลอดภัยหากเธรดอื่นเริ่มเรียงลำดับเดียวกัน (ดีกว่าที่จะครอบคลุมเคสนี้มากกว่าไม่ครอบคลุมให้ดูการล็อกข้อความด้านล่าง)
- อันดับที่สอง
RENAME ...
แทนที่ด้วยคำจำกัดความของตารางอ้างอิงจาก
คู่มือ MySQL
สำหรับรายละเอียด
- ในที่สุด
DROP ...
เพียงล้างโต๊ะเก่าอย่างชัดเจน
การห่อคำสั่งทั้งหมดด้วยบางอย่างเช่นSELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');
อนุญาตให้เรียกใช้คำสั่งทั้งหมดตามลำดับโดยไม่มีการตรวจสอบข้อผิดพลาด แต่ฉันไม่คิดว่ามันเป็นความคิดที่ดี: การเพิ่มความซับซ้อนและฟังก์ชั่นล็อคใน MySQL ไม่ปลอดภัยสำหรับการจำลองแบบข้อความ
หากข้อมูลในตารางควรอยู่รอดการอัพเกรดคำจำกัดความของตาราง ... สำหรับกรณีทั่วไปมันเป็นเรื่องที่ซับซ้อนมากขึ้นเกี่ยวกับการเปรียบเทียบคำจำกัดความของตารางเพื่อหาความแตกต่างและสร้างALTER ...
คำสั่งที่เหมาะสมซึ่งไม่สามารถทำได้โดยอัตโนมัติเช่นเมื่อเปลี่ยนชื่อคอลัมน์
หมายเหตุด้านข้าง 1:
คุณสามารถจัดการกับมุมมองโดยใช้วิธีการเดียวกันในกรณีนี้CREATE/DROP TABLE
เพียงแปลงเป็นCREATE/DROP VIEW
ในขณะที่RENAME TABLE
ยังคงไม่เปลี่ยนแปลง ในความเป็นจริงคุณสามารถเปลี่ยนตารางเป็นมุมมองและในทางกลับกัน
CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;
หมายเหตุด้านข้าง 2:
ผู้ใช้ MariaDB ควรมีความสุขกับปัญหาCREATE OR REPLACE TABLE/VIEW
ที่มีอยู่แล้วและเป็นประเด็นที่ดี