คำถามติดแท็ก alter-table

คำสั่ง SQL ที่ใช้เพื่อแก้ไขวัตถุตารางที่มีอยู่

3
ปรับเปลี่ยนตารางทั้งหมดในฐานข้อมูลด้วยคำสั่งเดียว
มีคำสั่งเดียวหรือหนึ่งบรรทัดเพื่อแก้ไขตารางทั้งหมดภายในฐานข้อมูล ฉันต้องการออกคำสั่งนี้ในทุกตารางภายในฐานข้อมูล: ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8; วัตถุประสงค์ของฉันคือการแก้ไขชุดอักขระจาก latin1 เป็น utf8 เป็นตารางทั้งหมด ปรับปรุง: RDBMS คือ MySQL

2
วิธีที่เร็วที่สุดในการเปลี่ยนประเภทข้อมูลคีย์ดัชนีที่จัดทำตาราง 600GB จาก INT เป็น BIGINT
ฉันต้องการเปลี่ยนประเภทข้อมูลจาก INT เป็น BIGINT ในตาราง MySQL 600GB คอลัมน์มีดัชนีที่ไม่ซ้ำกัน ฉันอาจจะดีกับ INT ที่ไม่ได้ลงนาม แต่ฉันคิดว่าการเปลี่ยนแปลงนั้นมิฉะนั้น BIGINT จะเจ็บปวดเหมือนกัน เอ็นจิ้นของตารางคือ InnoDB อะไรจะง่ายขึ้น: แก้ไขตาราง โครงสร้างการคัดลอกและ INSERT INTO (SELECT *) ตารางการดัมพ์และการเปลี่ยนนิยามตารางไฟล์ดัมพ์ มีอะไรอีกไหม ปรับปรุง: ตามที่ร้องขอ MySQL เวอร์ชั่น 5.5.15 ไม่มีคีย์ต่างประเทศและสร้างตาราง: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `created_at` datetime NOT NULL, `tid` bigint(20) …

4
คอลัมน์ Fast change NVARCHAR (4000) เป็น NVARCHAR (260)
ฉันมีปัญหาด้านประสิทธิภาพกับหน่วยความจำขนาดใหญ่มากที่จัดการตารางนี้ด้วยNVARCHAR(4000)คอลัมน์สองสามรายการ NVARCHAR(260)สิ่งที่เป็นคอลัมน์เหล่านี้ไม่เคยมีขนาดใหญ่กว่า การใช้ ALTER TABLE [table] ALTER COLUMN [col] NVARCHAR(260) NULL ผลใน SQL Server เขียนใหม่ทั้งตาราง (และใช้ขนาดตาราง 2x ในพื้นที่บันทึก) ซึ่งเป็นพันล้านแถวเท่านั้นที่จะเปลี่ยนแปลงอะไรไม่มีตัวเลือก การเพิ่มความกว้างของคอลัมน์ไม่มีปัญหานี้ แต่เป็นการลดลง ฉันได้ลองสร้างข้อ จำกัดCHECK (DATALENGTH([col]) <= 520)หรือCHECK (LEN([col]) <= 260)และ SQL Server ยังคงตัดสินใจที่จะเขียนตารางใหม่ทั้งหมด มีวิธีใดบ้างในการแก้ไขชนิดข้อมูลคอลัมน์เป็นการดำเนินการเฉพาะเมทาดาทา ไม่มีค่าใช้จ่ายในการเขียนใหม่ทั้งตาราง? ฉันใช้ SQL Server 2017 (14.0.2027.2 และ 14.0.3192.2) นี่คือตาราง DDL ตัวอย่างที่จะใช้ในการทำซ้ำ: CREATE TABLE [table]( id INT IDENTITY(1,1) …

3
เพิ่มคอลัมน์การเปลี่ยนแปลงความเร็วในตารางขนาดใหญ่เป็น NON NULL
ฉันเพิ่งเพิ่มคอลัมน์บิตแบบ NULL ไปยังตารางที่มีเกือบ 500 ล้านแถว ไม่มีค่าเริ่มต้นในคอลัมน์อย่างไรก็ตามส่วนแทรกทั้งหมดกำลังระบุค่าเป็น 0 หรือ 1 และฉันใช้รูทีนแบบครั้งเดียวเพื่อกำหนด 0 หรือ 1 ให้กับแถวที่มีอยู่ทั้งหมด (อัปเดตแถวเป็นชุดเล็ก ๆ ) ตอนนี้ทุกแถวควรมี 0 หรือ 1 ในคอลัมน์นั้น ฉันต้องการทำให้คอลัมน์บิตเป็นโมฆะไม่ได้ แต่เมื่อฉันพยายามทำมันผ่านALTER TABLE t1 ALTER COLUMN c1 bit not nullมันเริ่มทำงานเป็นเวลา 3 นาทีและฉันหยุดมันเพราะมันบล็อกการอ่านตารางทั้งหมดและฉันสงสัยว่ามันจะใช้เวลานานกว่าจะเสร็จสมบูรณ์ . เป็นไปได้ที่จะใช้เวลาไม่นาน แต่ฉันไม่สามารถเสี่ยงกับการขาดความพร้อมมากเกินไป การย้อนกลับใช้เวลา 6 นาที คุณมีคำแนะนำใด ๆ เกี่ยวกับวิธีที่ฉันจะทำให้คอลัมน์ไม่เป็นโมฆะโดยที่ไม่ต้องใช้เวลาหลายชั่วโมงกว่าจะเสร็จ นอกจากนี้ยังมีวิธีใดที่จะประมาณว่าALTER TABLE ALTER COLUMNคำสั่งที่ฉันเริ่มและยกเลิกจะใช้เวลานานเท่าใด ฉันใช้ SQL Server …

4
ปล่อยข้อ จำกัด (ดัชนี) บนคอลัมน์
ฉันจะแก้ไขประเภทในตารางที่มีดัชนีอยู่ได้อย่างไร ฉันพยายามที่จะแก้ไขคอลัมน์ในตารางว่างเปล่าเพื่อแก้ไขประเภทจากวันที่เป็น varchar (15) และมีข้อผิดพลาดที่บอกว่ามีการพึ่งพาคอลัมน์ (ซึ่งกลายเป็นดัชนี) ฉันสามารถไปที่จุดนี้ได้อย่างง่ายดายด้วยการคลิกขวาที่ดัชนีและวางสคริปต์ แต่ฉันจำเป็นต้องทำสิ่งนี้บนเซิร์ฟเวอร์อื่น ๆ ที่ฉันจะไม่สามารถเข้าถึงชื่อดัชนีได้ มีวิธีที่ฉันสามารถสร้างสคริปต์ที่จะวางดัชนีใด ๆ ให้ฉันทำประเภทข้อมูลที่เปลี่ยนแปลงในคอลัมน์แล้วอ่านดัชนีหรือไม่ ขอบคุณ!

5
MySQL - วิธีที่เร็วที่สุดในการเปลี่ยนตารางสำหรับ InnoDB
ฉันมีตาราง InnoDB ที่ฉันต้องการแก้ไข ตารางมีแถว ~ 80M และออกจากไม่กี่ดัชนี ฉันต้องการเปลี่ยนชื่อของคอลัมน์ใดคอลัมน์หนึ่งและเพิ่มดัชนีอีกสองสามรายการ วิธีที่เร็วที่สุดที่จะทำคืออะไร (สมมติว่าฉันสามารถประสบแม้กระทั่งการหยุดทำงาน - เซิร์ฟเวอร์เป็นทาสที่ไม่ได้ใช้)? คำว่า "ธรรมดา" alter tableคือทางออกที่เร็วที่สุดหรือไม่? ในเวลานี้สิ่งที่ฉันสนใจคือความเร็ว :)

2
ฉันสามารถเปลี่ยนชื่อค่าในคอลัมน์ MySQL ENUM ในหนึ่งแบบสอบถามได้หรือไม่
ENUM('value_one','value_two')สมมติว่าฉันมีตารางฐานข้อมูลที่มี ENUM('First value','Second value')ฉันต้องการที่จะเปลี่ยนที่ไปยัง ฉันกำลังทำสิ่งดังต่อไปนี้: ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value'); UPDATE `table` SET `column`='First Value' WHERE `column`='value_one'; UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two'; ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value'); มีวิธีที่มีประสิทธิภาพมากขึ้นในการทำเช่นนี้ EG มีวิธีในการทำสิ่งนี้ให้สำเร็จด้วย คำสั่งเดียว ALTER TABLEหรือไม่?

2
เปลี่ยนคอลัมน์ NULL อย่างรวดเร็วเป็น NOT NULL
ฉันมีตารางที่มีแถวเป็นล้านแถวและคอลัมน์ที่อนุญาตให้มีค่า NULL อย่างไรก็ตามในขณะนี้ไม่มีแถวที่มีค่า NULL สำหรับคอลัมน์นั้น (ฉันสามารถตรวจสอบได้อย่างรวดเร็วด้วยแบบสอบถาม) อย่างไรก็ตามเมื่อฉันรันคำสั่ง ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL; แบบสอบถามใช้เวลาพูดค่อนข้างตลอดไป ใช้เวลาประมาณ 10 ถึง 20 นาทีซึ่งนานกว่าสองเท่าของการเพิ่มข้อ จำกัด การตรวจสอบ มีวิธีอัปเดตข้อมูลเมตาของตารางสำหรับคอลัมน์นั้นทันทีโดยเฉพาะเมื่อฉันรู้ว่าไม่มีแถวใดที่มีค่า NULL สำหรับคอลัมน์นั้น

1
ALTER TABLE หรือไม่ DROP COLUMN เป็นเพียงข้อมูลเมตาดาต้าเท่านั้น
ฉันพบแหล่งข้อมูลหลายแห่งที่ระบุเปลี่ยนแปลงตาราง ... DROP COLUMN เป็นการดำเนินการเฉพาะเมตาดาต้า แหล่ง สิ่งนี้จะเป็นอย่างไร ข้อมูลในระหว่าง DROP COLUMN ไม่จำเป็นต้องถูกลบออกจากดัชนีที่ไม่ใช่คลัสเตอร์และดัชนี / ฮีปคลัสเตอร์หรือไม่? นอกจากนี้เหตุใดMicrosoft Docs จึงบอกเป็นนัยว่าเป็นการดำเนินการที่บันทึกไว้อย่างสมบูรณ์ การปรับเปลี่ยนที่ทำกับตารางจะถูกบันทึกและสามารถกู้คืนได้อย่างสมบูรณ์ การเปลี่ยนแปลงที่ส่งผลกระทบต่อทุกแถวในตารางขนาดใหญ่เช่นลดลงคอลัมน์หรือในบางรุ่นของ SQL Server เพิ่มคอลัมน์ไม่เป็นโมฆะด้วยค่าเริ่มต้นที่สามารถใช้เวลานานในการสร้างที่สมบูรณ์และบันทึกเข้าสู่ระบบจำนวนมาก เรียกใช้คำสั่ง ALTER TABLE เหล่านี้ด้วยความระมัดระวังเช่นเดียวกับคำสั่ง INSERT, UPDATE หรือ DELETE ที่มีผลกับแถวจำนวนมาก ในฐานะที่เป็นคำถามรอง: เครื่องยนต์จะติดตามคอลัมน์ที่ถูกทิ้งได้อย่างไรหากข้อมูลไม่ได้ถูกลบออกจากหน้าเว็บต้นแบบ

4
วิธีเพิ่มคอลัมน์ที่มีข้อ จำกัด foreign key ไปยังตารางที่มีอยู่แล้ว?
ฉันมีตารางต่อไปนี้ CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); ฉันจะเปลี่ยนmessagesตารางเช่นนั้นได้อย่างไร คอลัมน์ใหม่ที่เรียกว่าsenderถูกเพิ่มเข้าไป โดยที่senderเป็น foreign key อ้างอิงusersตาราง สิ่งนี้ไม่ทำงาน # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist คำสั่งนี้ไม่ได้สร้างคอลัมน์ด้วยหรือไม่?

1
การเพิ่มคอลัมน์แบบ nullable ลงในตารางมีค่าใช้จ่ายมากกว่า 10 นาที
ฉันมีปัญหาในการเพิ่มคอลัมน์ใหม่ในตาราง ฉันพยายามเรียกใช้สองสามครั้ง แต่หลังจากผ่านไปนานกว่า 10 นาทีฉันตัดสินใจยกเลิกคิวรีเนื่องจากเวลาล็อค ALTER TABLE mytable ADD mycolumn VARCHAR(50); ข้อมูลที่เป็นประโยชน์: รุ่น PostgreSQL: 9.1 จำนวนแถว: ~ 250K จำนวนคอลัมน์: 38 จำนวนคอลัมน์ที่ nullable: 32 จำนวนข้อ จำกัด : 5 (1 PK, 3 FK, 1 UNIQUE) จำนวนดัชนี: 1 ประเภทระบบปฏิบัติการ: Debian Squeeze 64 ฉันพบข้อมูลที่น่าสนใจเกี่ยวกับวิธีที่ PostgreSQL จัดการคอลัมน์ที่ไม่มีค่า (ผ่าน HeapTupleHeader) การเดาครั้งแรกของฉันคือเนื่องจากตารางนี้มีคอลัมน์ที่สามารถ nullable ได้ 32 คอลัมน์ซึ่งมี 8 …

1
จะเกิดอะไรขึ้นเมื่อคุณแก้ไข (ลด) ความยาวของคอลัมน์
ช่วยบอกฉันมีสองคอลัมน์ของชนิดNUMBER(โดยไม่ต้องแม่นยำและขนาด) VARCHAR(300)และ ผมเห็นว่าคอลัมน์เหล่านี้เป็นวิธีที่มีขนาดใหญ่เกินไปสำหรับข้อมูลของฉันดังนั้นฉันต้องการที่จะปรับเปลี่ยนให้พวกเขาและNUMBER(11) VARCHAR(10)ดังนั้นถ้าฉันรันคำสั่ง SQL นี้: ALTER TABLE FOO MODIFY(BAR NUMBER(10)); ฉันจะสามารถทำเช่นนั้นในคอลัมน์ที่ไม่มีข้อมูลได้หรือไม่ ถ้าเป็นเช่นนั้นจะเกิดอะไรขึ้นถ้ามีค่าหนึ่งมากกว่าNUMBER(10)คำทำนายจะบอกฉันเกี่ยวกับมัน? ค่าเริ่มต้นของคอลัมน์จะไม่เปลี่ยนแปลงหากกำหนดไว้ก่อนหน้านี้หรือไม่ ตัวเลือก nullable คอลัมน์จะไม่เปลี่ยนแปลงหรือไม่ คีย์หลักต่างประเทศรหัสเฉพาะในคอลัมน์นั้นจะไม่มีการเปลี่ยนแปลงหรือไม่ ข้อ จำกัด ที่เกี่ยวข้องกับคอลัมน์นั้นจะไม่มีการเปลี่ยนแปลงหรือไม่ ดัชนีในคอลัมน์นั้นจะไม่มีการเปลี่ยนแปลงหรือไม่ มีเอกสารอย่างเป็นทางการตอบคำถามของฉันหรือไม่

2
จะปลอดภัยไหมที่จะยกเลิกการสืบค้น PostgreSQL ALTER TABLE ที่รอการล็อก?
เราเริ่มALTER TABLEคำถามเมื่อหลายชั่วโมงก่อนและเพิ่งรู้ว่าเพิ่งผ่านpg_stat_activityการล็อค เราค้นพบแบบสอบถามอื่น ๆ ที่ถือล็อคบนตารางที่เราต้องการแก้ไขและไม่ปล่อยให้มันไป แบบสอบถามของเราคือแบบสอบถามแบบ "ง่าย" (การเปลี่ยนชนิดข้อมูลคอลัมน์) แต่กำลังทำงานบนตารางขนาดใหญ่ ALTER TABLEแทนที่จะฆ่ากระบวนการที่จะถือไว้ล็อคเราได้ตัดสินใจว่าเราอยากจะฆ่า เราไม่ได้ห่อALTER TABLEในการทำธุรกรรม เท่าที่ฉันเข้าใจความจริงที่ว่าแบบสอบถามของเรากำลังรอการล็อกหมายความว่ามันกำลังรอการล็อคอยู่เสมอและมันไม่เคยเปลี่ยนแปลงอะไรเลย มันเป็นเรื่องจริงเหรอ? ปลอดภัยALTER TABLEหรือไม่ที่เราจะยกเลิกการสอบถามของเราทันที หรือเป็นไปได้ว่าแบบสอบถามได้แก้ไขบางสิ่งบางอย่างแล้วและการยกเลิกจะทำให้ฐานข้อมูลของเราอยู่ในสถานะกึ่งกลางหรือไม่ PS: SELECT pg_cancel_backend(pid);แผนคือการยกเลิกการใช้ หากนี่เป็นความคิดที่ไม่ดีโปรดแจ้งให้เราทราบ

2
PostgreSQL เพิ่มประสิทธิภาพการเพิ่มคอลัมน์ด้วยค่าเริ่มต้นที่ไม่ใช่ค่า NULL หรือไม่
เมื่อเพิ่มNOT NULLคอลัมน์ที่มีDEFAULTค่า - PostgreSQL ปรับการดำเนินการนี้ให้เหมาะสมหรือไม่ ในกรณีที่ตารางมี n แถว, คอลัมน์เปลี่ยนแปลงที่ไม่ได้รับการปรับให้เหมาะสมจะทำให้การเขียน n ของค่าเริ่มต้น - ซึ่งอาจเป็นเรื่องที่เจ็บปวดอย่างมาก ด้วยการปรับให้เหมาะสมฐานข้อมูลจะสร้างคอลัมน์ใหม่ทันทีเก็บเพียงหนึ่งสำเนาของค่าเริ่มต้นซึ่งจะถูกส่งกลับเมื่อไม่พบค่าที่ไม่ใช่ค่าเริ่มต้นสำหรับคอลัมน์นั้นในโครงสร้างข้อมูลดัชนีที่เหมาะสม ตัวอย่างเช่นOracle 11g มีการเพิ่มประสิทธิภาพเช่นนั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.