หากตารางมีตารางดร็อปอยู่ให้สร้างขึ้นหากไม่มีอยู่ให้สร้างขึ้น


151

ฉันนิ่งงันฉันไม่รู้จะทำอย่างไร

โดยทั่วไปฉันแค่ต้องการสร้างตาราง แต่ถ้ามันมีอยู่มันจะต้องมีการลดลงและสร้างขึ้นใหม่ไม่ได้ถูกตัดทอน แต่ถ้ามันไม่มีอยู่เพียงแค่สร้างมัน

ใครบ้างที่สามารถช่วยได้

ขอบคุณจอร์จ


@Shomz นั่นคือสิ่งที่พวกเขาต้องการ ทว่าการมีอยู่ของคำถามนี้และมุมมอง 20k ในหน้านี้พิสูจน์ให้เห็นว่านั่นเป็นเรื่องง่ายเหมือนการแปลงภาษาอังกฤษเป็นภาษากรีก
Pacerier

2
@Pacerier διαγραφή πίνακα, εφόσον υπάρχειไม่สามารถตกลงเพิ่มเติม:
Shomz

@Shomz มีข้อผิดพลาดทางไวยากรณ์
Pacerier

คำตอบ:


298

เพียงแค่ใส่คำสั่งDROP TABLE IF EXISTS `tablename`;ของคุณCREATE TABLE

คำสั่งนั้นดร็อปตารางหากมีอยู่ แต่จะไม่โยนข้อผิดพลาดหากไม่มี


1
ขอบคุณ! นอกจากนี้ยังใช้สำหรับรายการตารางหรือมุมมอง! DROP TABLE IF EXISTS 'table1', 'table2';และปล. - DROP VIEW IF EXISTS 'view1', 'view2';คาถาอะไรที่คุณเคยใช้ในการใส่รหัสอินไลน์!
Campbeln

2
@Campbeln เพียงเพิ่ม backticks เป็นสองเท่าก่อนและหลังส่วนรหัส Backticks เดียวจะแสดงคำต่อคำ
r3mainer


8

อืม ... สำหรับปีที่ไม่มีใครพูดถึงสิ่งหนึ่งที่บอบบาง

แม้จะ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ที่มีอยู่แล้วและเป็นประเด็นที่ดี


1

ฉันต้องการวางตารางและสร้างใหม่ด้วยข้อมูลจากมุมมอง ฉันกำลังสร้างตารางจากมุมมองและนี่คือสิ่งที่ฉันทำ:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

ข้างต้นทำงานให้ฉันโดยใช้ MySQL MariaDb


วางตาราง table_name; สร้างตารางเป็น select * จากมุมมอง;
sirskoy

หากคุณอยู่ใน MariaDB (MySQL ขาดสิ่งนี้) คุณก็สามารถทำได้CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.