ฉันจะเปลี่ยนชื่อคอลัมน์ในตารางฐานข้อมูล SQLite ได้อย่างไร


296

ฉันต้องการเปลี่ยนชื่อคอลัมน์บางคอลัมน์ในบางตารางในฐานข้อมูล SQLite ฉันรู้ว่าคำถามที่คล้ายกันถูกถามใน stackoverflow ก่อนหน้านี้ แต่สำหรับ SQL โดยทั่วไปและกรณีของ SQLite ไม่ได้กล่าวถึง

จากเอกสาร SQLite สำหรับALTER TABLEฉันรวบรวมว่ามันเป็นไปไม่ได้ที่จะทำสิ่งนั้น "ง่าย" (เช่นคำสั่ง ALTER TABLE เดียว)

ฉันสงสัยว่ามีคนรู้วิธีการทั่วไปของ SQL ในการทำสิ่งนั้นกับ SQLite


คุณสามารถทำได้โดยใช้เบราว์เซอร์ db สำหรับ sqliteค่อนข้างง่าย
Matt G

1
โปรดลองทำเครื่องหมายคำตอบนี้ว่าstackoverflow.com/a/52346199/124486 ที่
Evan Carroll

คำตอบ:


66

นี่ได้รับการแก้ไขด้วย2018-09-15 (3.25.0)

การปรับปรุงALTER TABLEคำสั่ง:

  • เพิ่มการสนับสนุนสำหรับการเปลี่ยนชื่อคอลัมน์ในตารางโดยใช้ตารางALTER TABLERENAME COLUMN oldname TO newname
  • แก้ไขคุณลักษณะการเปลี่ยนชื่อตารางเพื่อให้อัพเดตการอ้างอิงไปยังตารางที่เปลี่ยนชื่อในทริกเกอร์และมุมมอง

คุณสามารถค้นหาไวยากรณ์ใหม่ที่บันทึกไว้ภายใต้ ALTER TABLE

RENAME COLUMN TOไวยากรณ์การเปลี่ยนแปลงคอลัมน์ชื่อของตารางชื่อเข้าใหม่คอลัมน์ชื่อ ชื่อคอลัมน์มีการเปลี่ยนแปลงทั้งภายในนิยามของตารางและยังอยู่ในดัชนีทริกเกอร์และมุมมองทั้งหมดที่อ้างอิงคอลัมน์ หากการเปลี่ยนชื่อคอลัมน์จะส่งผลให้เกิดความกำกวมเชิงความหมายในทริกเกอร์หรือมุมมองดังนั้นความRENAME COLUMNล้มเหลวที่มีข้อผิดพลาดและไม่มีการเปลี่ยนแปลงใด ๆ

ป้อนคำอธิบายรูปภาพที่นี่ แหล่งที่มาของภาพ: https://www.sqlite.org/images/syntax/alter-table-stmt.gif

ตัวอย่าง:

CREATE TABLE tab AS SELECT 1 AS c;

SELECT * FROM tab;

ALTER TABLE tab RENAME COLUMN c to c_new;

SELECT * FROM tab;

การสาธิต db-fiddle.com


รองรับ Android

ในฐานะของการเขียนของ Android API 27 ใช้แพคเกจข้อมูล SQLite รุ่น 3.19

จากเวอร์ชันปัจจุบันที่ใช้ Android และการอัปเดตนี้มาในเวอร์ชั่น 3.25.0 ของ SQLite ฉันจะบอกว่าคุณมีการรอสักครู่ (ประมาณ API 33) ก่อนที่จะมีการเพิ่มการรองรับลงใน Android

และถึงแม้ว่าถ้าคุณต้องการสนับสนุนเวอร์ชันใด ๆ ที่เก่ากว่า API 33 คุณจะไม่สามารถใช้สิ่งนี้ได้


8
ฉันใช้งานการย้ายข้อมูล Android และน่าเสียดายที่ IntelliJ แสดงคำเตือนว่าไม่ใช่คำสั่ง SQL ที่ถูกต้อง database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount"). COLUMจะเน้นสีสีแดงและกล่าวว่าการที่คาดว่าจะมี 'คอลัมน์' น่าเสียดายที่ Android ยังคงใช้งานบน SQLite เวอร์ชัน3.19ซึ่งเป็นสาเหตุที่ทำให้ฉันใช้งานไม่ได้
Adam Hurwitz

1
แก้ไข: ฉันได้พบกับsystem.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q1ว่า 1.0.109.x) ใช้ SQLite 3.24 และ System.Data.SQLite จริง ๆ การใช้ SQLite 3.25 นั้นจะมีการกำหนดวันที่ใหม่
rychlmoj

1
FYI โชคไม่ดีที่สิ่งนี้ยังไม่ถูกนำไปใช้กับไลบรารี่ SQLite ของ Android หวังว่าพวกเขาจะอัปเดตในไม่ช้า
Adam Hurwitz

3
ฉันเพิ่มส่วนสำหรับการสนับสนุน Android เพื่อป้องกันไม่ให้ผู้อื่นเริ่มหวัง ขึ้นอยู่กับการใช้งานปัจจุบันของ Android 27 ของ SQLite 3.19 เราจะต้องรอจนกว่าจะถึง API 33 อย่างคร่าวๆก่อนที่คุณสมบัตินี้จะถูกเพิ่มลงใน Android และถึงแม้จะรองรับเฉพาะเวอร์ชันล่าสุดเท่านั้น ถอนหายใจ
Joshua Pinter

1
@JoshuaPinter ขอบคุณที่ขยายคำตอบของฉัน
Lukasz Szozda

448

สมมติว่าคุณมีตารางและต้องการเปลี่ยนชื่อ "colb" เป็น "col_b":

ก่อนอื่นคุณเปลี่ยนชื่อโต๊ะเก่า:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

จากนั้นสร้างตารางใหม่โดยยึดตามตารางเก่า แต่ด้วยชื่อคอลัมน์ที่อัปเดต:

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

จากนั้นคัดลอกเนื้อหาตรงข้ามจากตารางต้นฉบับ

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

สุดท้ายวางตารางเก่า

DROP TABLE tmp_table_name;

การห่อทั้งหมดนี้ในBEGIN TRANSACTION;และCOMMIT;อาจเป็นความคิดที่ดี


51
และอย่าลืมดัชนีของคุณ
Tom Mayfield

11
ที่สำคัญรหัสตัวอย่างด้านบนไม่มีธุรกรรม คุณควรห่อสิ่งทั้งหมดไว้ใน BEGIN / END (หรือ ROLLBACK) เพื่อให้แน่ใจว่าการเปลี่ยนชื่อเสร็จสมบูรณ์หรือไม่
Roger Binns

4
ทุกคนที่ต้องการทำเช่นนี้ในหุ่นยนต์สามารถดำเนินการทำธุรกรรมโดยใช้SQLiteDatabase.beginTransaction ()
bmaupin

7
ไม่มีอะไรในรหัสในคำตอบที่คัดลอกดัชนี การสร้างตารางที่ว่างเปล่าและใส่ข้อมูลลงในมันเพียงคัดลอกโครงสร้างและข้อมูล หากคุณต้องการข้อมูลเมตา (ดัชนี, คีย์ต่างประเทศ, ข้อ จำกัด ฯลฯ ) คุณต้องออกคำสั่งเพื่อสร้างข้อมูลเหล่านั้นบนตารางที่ถูกแทนที่
Tom Mayfield

17
.schemaคำสั่งของ SQLite มีประโยชน์สำหรับการแสดงCREATE TABLEคำสั่งที่ทำให้ตารางที่มีอยู่ คุณสามารถนำเอาท์พุทของมันปรับเปลี่ยนได้ตามต้องการและดำเนินการเพื่อสร้างตารางใหม่ คำสั่งนี้ยังแสดงCREATE INDEXคำสั่งที่จำเป็นในการสร้างดัชนีซึ่งควรครอบคลุมข้อกังวลของโทมัส แน่นอนให้แน่ใจว่าได้รันคำสั่งนี้ก่อนทำการเปลี่ยนแปลงอะไร
Mike DeSimone

56

เมื่อขุดไปรอบ ๆ ฉันพบเครื่องมือกราฟิกหลายแพลตฟอร์มนี้ (Linux | Mac | Windows) ที่เรียกว่าDB Browser สำหรับ SQLiteที่จริงแล้วอนุญาตให้เปลี่ยนชื่อคอลัมน์ด้วยวิธีที่เป็นมิตรกับผู้ใช้!

แก้ไข | แก้ไขตาราง | เลือกตาราง | แก้ไขฟิลด์ คลิกคลิก! Voila!

อย่างไรก็ตามถ้ามีคนต้องการแบ่งปันวิธีการเขียนโปรแกรมแบบนี้ฉันยินดีที่จะรู้!


1
นอกจากนี้ยังมีFirefox add-on ที่ทำสิ่งเดียวกันคลิกขวาที่คอลัมน์ที่คุณต้องการเปลี่ยนชื่อและเลือก "แก้ไขคอลัมน์"
Jacob Hacker

1
แม้ใน openSUSE ก็มีให้ใช้งานเป็นแพ็คเกจ: software.opensuse.org/package/sqlitebrowser

มันแปลกมากที่มีคะแนนเสียงมากมาย เรากำลังพูดถึงการเขียนโปรแกรมที่นี่ (รหัส) ทำไมคุณถึงโพสต์คำตอบนี้ที่นี่
25

2
ไม่มีการเอ่ยถึงวิธีการทำเช่นนี้กับรหัสในคำถามของฉัน ฉันแค่อยากรู้วิธีเปลี่ยนชื่อคอลัมน์ใน SQLite DB
joce

@joce ฉันรักคุณ !!! (เหมือนพี่ชาย) ทำให้ฉันเปลี่ยนสนาม voila ฉันส่งออกตาราง MS Access ไปยัง SQLite และหนึ่งในนั้นมีตัวเลขอยู่ด้านหน้า: 3YearLetterSent Visual Studio สร้างคลาสจากตาราง แต่สำลักกับตัวเลข "3" ที่ด้านหน้าชื่อฟิลด์ ฉันรู้สิ่งนี้ไม่ได้ดู
JustJohn

53

แม้ว่าจะเป็นจริงที่ไม่มีคอลัมน์ ALTER หากคุณต้องการเปลี่ยนชื่อคอลัมน์วางข้อ จำกัด NOT NULL หรือเปลี่ยนชนิดข้อมูลคุณสามารถใช้ชุดคำสั่งต่อไปนี้:

หมายเหตุ: คำสั่งเหล่านี้มีโอกาสที่จะทำให้ฐานข้อมูลของคุณเสียหายดังนั้นตรวจสอบให้แน่ใจว่าคุณมีข้อมูลสำรอง

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

คุณจะต้องปิดและเปิดการเชื่อมต่ออีกครั้งหรือทำให้ฐานข้อมูลสูญญากาศเพื่อโหลดการเปลี่ยนแปลงลงในสคีมาใหม่

ตัวอย่างเช่น:

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
Error: BOOKS.publication_date may not be NULL  
sqlite> PRAGMA writable_schema = 1; 
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';  
sqlite> PRAGMA writable_schema = 0;  
sqlite> .q  

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
sqlite> .q  

การอ้างอิงดังต่อไปนี้:


pragma writable_schema
เมื่อ pragma นี้เปิดอยู่ตาราง SQLITE_MASTER ซึ่งฐานข้อมูลสามารถเปลี่ยนแปลงได้โดยใช้คำสั่ง UPDATE, INSERT และ DELETE ปกติ คำเตือน: การใช้ pragma ในทางที่ผิดอาจส่งผลให้ไฟล์ฐานข้อมูลเสียหาย

alter table
SQLite สนับสนุนชุดย่อยที่ จำกัด ของ ALTER TABLE คำสั่ง ALTER TABLE ใน SQLite อนุญาตให้ผู้ใช้เปลี่ยนชื่อตารางหรือเพิ่มคอลัมน์ใหม่ในตารางที่มีอยู่ ไม่สามารถเปลี่ยนชื่อคอลัมน์ลบคอลัมน์หรือเพิ่มหรือลบข้อ จำกัด ออกจากตารางได้

แก้ไขตาราง SYNTAX


3
อันตราย แต่อาจเป็นคำตอบที่ตรงไปตรงมาที่สุด
Tek

2
ใช่เร็วมาก - อันตรายเท่านั้นหมายถึง "ให้แน่ใจว่าคุณมีการสำรองข้อมูลครั้งแรก"
โนอาห์

6
รูปแบบไฟล์ sqlite นั้นง่ายมากและนั่นเป็นสาเหตุที่การดำเนินการนี้ถูกต้อง รูปแบบไฟล์มีข้อมูลเพียงสองชุดเกี่ยวกับตาราง: คำสั่ง CREATE TABLE จริงเป็นข้อความธรรมดาและแถวที่มีค่าปรากฏตามลำดับฟิลด์จากคำสั่ง CREATE ซึ่งหมายความว่ารหัส sqlite เปิดฐานข้อมูลแยกวิเคราะห์แต่ละคำสั่ง CREATE และสร้างข้อมูลคอลัมน์แบบไดนามิกในหน่วยความจำ ดังนั้นคำสั่งใด ๆ ที่เปลี่ยนแปลงคำสั่ง CREATE ในลักษณะที่ลงท้ายด้วยจำนวนคอลัมน์เดียวกันจะใช้ได้แม้ว่าคุณจะเปลี่ยนประเภทหรือข้อ จำกัด
Thomas Tempelmann

3
@ThomasTempelmann อย่างไรก็ตามการเพิ่มข้อ จำกัด ที่ไม่ได้ดำเนินการโดยชุดข้อมูลจะทำให้เกิดปัญหาเนื่องจากผู้วางแผนแบบสอบถามคิดว่ามีข้อ จำกัด อยู่
fuz

2
@ThomasTempelmann การลบข้อ จำกัด นั้นใช้ได้ดีเสมอ การเพิ่มข้อ จำกัด นั้นใช้ได้ถ้าทุกข้อ จำกัด เป็นที่พอใจ แต่คุณจำเป็นต้องตรวจสอบ
fuz

18

เมื่อเร็ว ๆ นี้ผมต้องทำใน SQLite3 กับตารางชื่อจุดกับ colunms id, lon, ลาดพร้าว เมื่อนำเข้าตารางค่าสำหรับละติจูดที่เก็บไว้ในคอลัมน์โหลนและวิเซเวียดังนั้นการแก้ไขที่ชัดเจนจะเปลี่ยนชื่อคอลัมน์เหล่านั้น ดังนั้นเคล็ดลับคือ:

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

ฉันหวังว่านี่จะเป็นประโยชน์สำหรับคุณ!


วิธีนี้ไม่ได้คัดลอกค่า PK อย่างเหมาะสมและสร้างคอลัมน์ rowid ที่ซ่อนอยู่โดยอัตโนมัติ ไม่จำเป็นต้องมีปัญหา แต่ต้องการชี้ให้เห็นว่าเพราะมันกลายเป็นปัญหาสำหรับฉัน
TPoschel

4
มันจะง่ายกว่าหรือที่จะทำ "UPDATE points SET lon = lat, lat = lon;"?
kstep

1
คำตอบนี้จะทำตามคำสั่งที่ถูกต้อง แรกสร้างตาราง temp และเติมมันแล้วทำลายเดิม
Xeoncross

14

การอ้างถึงเอกสาร sqlite :

SQLite สนับสนุนชุดย่อยที่ จำกัด ของ ALTER TABLE คำสั่ง ALTER TABLE ใน SQLite อนุญาตให้ผู้ใช้เปลี่ยนชื่อตารางหรือเพิ่มคอลัมน์ใหม่ในตารางที่มีอยู่ ไม่สามารถเปลี่ยนชื่อ colum ลบคอลัมน์หรือเพิ่มหรือลบข้อ จำกัด ออกจากตารางได้

สิ่งที่คุณสามารถทำได้คือสร้างตารางใหม่ด้วยเลย์เอาต์ใหม่SELECT * FROM old_tableและเติมค่าที่คุณจะได้รับจากตารางใหม่


7

ก่อนอื่นนี่เป็นหนึ่งในสิ่งที่ทำให้ฉันตบหน้าด้วยความประหลาดใจ: การเปลี่ยนชื่อคอลัมน์ต้องสร้างตารางใหม่ทั้งหมดและคัดลอกข้อมูลจากตารางเก่าไปยังตารางใหม่ ...

GUI ที่ฉันได้เป็นเจ้าของที่ดินบนจะทำดำเนินการ SQLite เป็นฐาน มันมีหน้าต่างบันทึกที่ดีที่แสดงคำสั่งทั้งหมดที่ถูกเรียกใช้งาน การเปลี่ยนชื่อคอลัมน์ผ่านฐานข้อมูลจะทำให้หน้าต่างบันทึกมีคำสั่งที่จำเป็น:

หน้าต่างบันทึกฐาน

สิ่งเหล่านี้สามารถคัดลอกและวางได้อย่างง่ายดายในตำแหน่งที่คุณต้องการ สำหรับฉันแล้วนั่นเป็นไฟล์การโยกย้ายActiveAndroid สัมผัสที่ดีเช่นกันคือข้อมูลที่ถูกคัดลอกมีเพียงคำสั่ง SQLite ไม่ใช่การประทับเวลา ฯลฯ

หวังว่าจะช่วยให้บางคนเวลา


FYI ถ้าคุณกำลังใช้ActiveAndroidคุณสามารถละเว้นBEGIN TRANSACTION;และCOMMIT;สายเป็น ActiveAndroid จับที่ด้วยตัวเอง
Joshua Pinter

6

กรณีที่ 1: SQLite 3.25.0+

เฉพาะเวอร์ชัน 3.25.0 ของ SQLite รองรับการเปลี่ยนชื่อคอลัมน์ หากอุปกรณ์ของคุณตรงตามข้อกำหนดนี้สิ่งต่าง ๆ ค่อนข้างง่าย แบบสอบถามด้านล่างจะแก้ปัญหาของคุณ:

ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";

กรณีที่ 2: SQLite เวอร์ชั่นที่เก่ากว่า

คุณต้องทำตามวิธีการอื่นเพื่อให้ได้ผลลัพธ์ที่อาจจะยุ่งยากเล็กน้อย

ตัวอย่างเช่นหากคุณมีโต๊ะแบบนี้:

CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)

และหากคุณต้องการเปลี่ยนชื่อของคอลัมน์ Location

ขั้นตอนที่ 1:เปลี่ยนชื่อตารางต้นฉบับ:

ALTER TABLE student RENAME TO student_temp;

ขั้นตอนที่ 2:ตอนนี้สร้างตารางใหม่studentด้วยชื่อคอลัมน์ที่ถูกต้อง:

CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)

ขั้นตอนที่ 3:คัดลอกข้อมูลจากตารางต้นฉบับไปยังตารางใหม่:

INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;

หมายเหตุ: คำสั่งดังกล่าวควรเป็นหนึ่งบรรทัดทั้งหมด

ขั้นตอนที่ 4:วางตารางต้นฉบับ:

DROP TABLE student_temp;

ด้วยสี่ขั้นตอนเหล่านี้คุณสามารถเปลี่ยนตาราง SQLite ด้วยตนเอง โปรดทราบว่าคุณจะต้องสร้างดัชนีผู้ดูหรือทริกเกอร์ในตารางใหม่ด้วยเช่นกัน


1
วิธีอัปเกรดฐานข้อมูล sqllite เป็น 3.29.0 ใน android studio ฉันใช้ api ระดับ 28
ซอฟต์แวร์

เวอร์ชัน SQLite ถูกกำหนดโดยอุปกรณ์ที่แอพทำงาน มันขึ้นอยู่กับอุปกรณ์
Febin Mathew

1
สำหรับผู้ที่ใช้ sqlite เก่าสี่ขั้นตอนด้านบนจะหมดกำลังใจ ดูส่วน "ข้อควรระวัง" ที่sqlite.org/lang_altertable.html
Jeff

3

เปลี่ยนคอลัมน์ตาราง <id> เป็น <_id>

 String LastId = "id";

    database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
    +"("
            + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
            + PhraseContract.COLUMN_PHRASE + " text ,"
            + PhraseContract.COLUMN_ORDER  + " text ,"
            + PhraseContract.COLUMN_FROM_A_LANG + " text"
    +")"
    );
    database.execSQL("INSERT INTO " +
            PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
            " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
            " FROM " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");

3

สร้างคอลัมน์ใหม่ด้วยชื่อคอลัมน์ที่ต้องการ: COLNew

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

คัดลอกเนื้อหาของคอลัมน์เก่า COLOld ไปยังคอลัมน์ใหม่ COLNew

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

หมายเหตุ: จำเป็นต้องใช้วงเล็บในบรรทัดด้านบน


2

ดังที่กล่าวไว้ก่อนหน้านี้มีเครื่องมือเบราว์เซอร์ฐานข้อมูล SQLite ซึ่งทำสิ่งนี้ เครื่องมือนี้เก็บบันทึกการทำงานทั้งหมดที่ดำเนินการโดยผู้ใช้หรือแอปพลิเคชัน การทำเช่นนี้เพียงครั้งเดียวและดูที่บันทึกของแอปพลิเคชันคุณจะเห็นรหัสที่เกี่ยวข้อง คัดลอกแบบสอบถามและวางตามต้องการ ทำงานให้ฉัน หวังว่านี่จะช่วยได้


2

จากเอกสารอย่างเป็นทางการ

ขั้นตอนที่ง่ายและเร็วขึ้นสามารถเลือกใช้สำหรับการเปลี่ยนแปลงบางอย่างที่ไม่มีผลกับเนื้อหาบนดิสก์ในทางใดทางหนึ่ง ขั้นตอนที่ง่ายกว่าต่อไปนี้เหมาะสมสำหรับการลบ CHECK หรือคีย์ FOREIGN หรือ NOT NULL ข้อ จำกัด การเปลี่ยนชื่อคอลัมน์หรือเพิ่มหรือลบหรือเปลี่ยนค่าเริ่มต้นในคอลัมน์

  1. เริ่มทำธุรกรรม

  2. รัน PRAGMA schema_version เพื่อกำหนดหมายเลขเวอร์ชันสกีมาปัจจุบัน หมายเลขนี้จะต้องใช้สำหรับขั้นตอนที่ 6 ด้านล่าง

  3. เปิดใช้งานการแก้ไขสคีมาโดยใช้ PRAGMA writable_schema = ON

  4. เรียกใช้คำสั่ง UPDATE เพื่อเปลี่ยนคำจำกัดความของตาราง X ในตาราง sqlite_master: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';

    ข้อควรระวัง: การเปลี่ยนแปลงตาราง sqlite_master เช่นนี้จะทำให้ฐานข้อมูลเสียหายและอ่านไม่ได้หากการเปลี่ยนแปลงมีข้อผิดพลาดทางไวยากรณ์ แนะนำว่าควรทำการทดสอบคำสั่ง UPDATE อย่างระมัดระวังบนฐานข้อมูลเปล่าที่แยกต่างหากก่อนที่จะใช้กับฐานข้อมูลที่มีข้อมูลสำคัญ

  5. หากการเปลี่ยนแปลงตาราง X มีผลกับตารางหรือดัชนีหรือทริกเกอร์อื่น ๆ คือมุมมองภายในสคีมาให้เรียกใช้คำสั่ง UPDATE เพื่อแก้ไขดัชนีตารางและมุมมองอื่น ๆ เหล่านั้นด้วย ตัวอย่างเช่นหากชื่อของคอลัมน์เปลี่ยนแปลงข้อ จำกัด ของ FOREIGN KEY ทั้งหมดทริกเกอร์ดัชนีและมุมมองที่อ้างถึงคอลัมน์นั้นจะต้องแก้ไข

    ข้อควรระวัง: การเปลี่ยนแปลงตาราง sqlite_master เช่นนี้จะทำให้ฐานข้อมูลเสียหายและอ่านไม่ได้หากการเปลี่ยนแปลงมีข้อผิดพลาด ทดสอบขั้นตอนทั้งหมดนี้อย่างระมัดระวังในฐานข้อมูลทดสอบแยกต่างหากก่อนที่จะใช้กับฐานข้อมูลที่มีข้อมูลสำคัญและ / หรือทำสำเนาสำรองของฐานข้อมูลสำคัญก่อนที่จะเรียกใช้ขั้นตอนนี้

  6. เพิ่มหมายเลขเวอร์ชันสกีมาโดยใช้ PRAGMA schema_version = X โดยที่ X เป็นหมายเลขมากกว่าหมายเลขเวอร์ชันสกีมาเก่าที่พบในขั้นตอนที่ 2 ด้านบน

  7. ปิดใช้งานการแก้ไขสคีมาโดยใช้ PRAGMA writable_schema = OFF

  8. (ไม่บังคับ) เรียกใช้ PRAGMA integrity_check เพื่อตรวจสอบว่าการเปลี่ยนแปลงสคีมานั้นไม่ได้ทำให้ฐานข้อมูลเสียหาย

  9. ยอมรับธุรกรรมเริ่มต้นในขั้นตอนที่ 1 ด้านบน


PRAGMA integrity_check ไม่ได้รับข้อผิดพลาดใด ๆ กับสคีมา
Graymatter

และมีปัญหาอะไรกับสิ่งนั้น?
Mohammad Yahia

1

ตัวเลือกหนึ่งถ้าคุณต้องการให้ทำในหยิกและหากคอลัมน์เริ่มต้นของคุณถูกสร้างขึ้นด้วยค่าเริ่มต้นคือการสร้างคอลัมน์ใหม่ที่คุณต้องการคัดลอกเนื้อหาไปที่มันและโดยทั่วไป "ทิ้ง" คอลัมน์เก่า (มันยังคงอยู่ นำเสนอ แต่คุณไม่ได้ใช้ / อัปเดต ฯลฯ )

อดีต:

alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically

สิ่งนี้จะทิ้งไว้ข้างหลังคอลัมน์ (และถ้ามันถูกสร้างขึ้นด้วย NOT NULL แต่ไม่มีค่าเริ่มต้นแล้วเม็ดมีดในอนาคตที่ไม่สนใจอาจจะล้มเหลว) แต่ถ้าเป็นเพียงตารางการโยนการแลกเปลี่ยนอาจยอมรับได้ มิฉะนั้นให้ใช้หนึ่งในคำตอบอื่น ๆ ที่กล่าวถึงที่นี่หรือฐานข้อมูลอื่นที่อนุญาตให้เปลี่ยนชื่อคอลัมน์



-3

sqlite3 yourdb .dump> /tmp/db.txt
แก้ไขชื่อ /tmp/db.txt เปลี่ยนคอลัมน์ในการสร้างบรรทัด
sqlite2 yourdb2 </tmp/db.txt
mv / ย้าย yourdb2 yourdb ของคุณ


3
คำตอบกำลังไม่ได้ให้ข้อมูลใด ๆ พวงของรหัส / คำแนะนำคายออกโดยไม่มีข้อมูลใด ๆ เพิ่มเติมเกี่ยวกับเหตุผลที่คุณคิดว่ามันจะทำงานหรืออะไรที่คิดว่าจะเกิดขึ้นถ้าคุณใช้มัน
RGLSV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.