sqliteのALTERCOLUMN


81

sqliteの列を変更するにはどうすればよいですか?これはPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

sqliteにはALTERCOLUMNはまったくなく、ALTERTABLEのみがサポートされていると思います。

何か案が?ありがとう!


ALTER COLUMN構文を要求しますが、何をしたいのかは言いません。それは私にこれが広すぎると思います。ALTER COLUMNは多くのことを実行できますが、pgの例のように非NULL制約を削除しようとしていますか?
エヴァンキャロル

使用したintelljdbツールの場合、列を変更すると、sqliteのコマンドが生成されます。
foolcage

回答:


111

sqliteにはALTERCOLUMNはありません。

私はあなたの唯一の選択肢は次のとおりだと信じています:

  • テーブルの名前を一時的な名前に変更します
  • NOTNULL制約なしで新しいテーブルを作成します
  • 古いテーブルの内容を新しいテーブルにコピーします
  • 古いテーブルを削除します

この他のStackoverflowの回答は、プロセスを詳細に説明しています


64

がALTERCOLUMNではないことは事実ですが、列の名前を変更したり、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**  

以下の参考資料:


プラグマwritable_schema
このプラグマがオンの場合、通常のUPDATE、INSERT、およびDELETEステートメントを使用してデータベースを変更できるSQLITE_MASTERテーブル。警告:このプラグマを誤用すると、データベースファイルが簡単に破損する可能性があります。

[alter table](http://www.sqlite.org/lang_altertable.htmlから)
SQLiteはALTERTABLEの限定されたサブセットをサポートします。SQLiteのALTERTABLEコマンドを使用すると、ユーザーはテーブルの名前を変更したり、既存のテーブルに新しい列を追加したりできます。列の名前を変更したり、列を削除したり、テーブルに制約を追加または削除したりすることはできません。

ALTERTABLE構文


7
このメソッドは私にとってはうまくいきましたが、列が異なる順序になる可能性がある状況を回避するために(つまり、前のADD COLUMNコマンドから)、次を使用しました:UPDATE SQLITE_MASTER SET SQL = replace(SQL、 '[MyColumn] integer NOT NULL' 、 '[MyColumn] integer NULL')WHERE NAME = 'MyTable'。また、これをトランザクションの一部として実行しないように注意してください。これにより、以前のトランザクションコマンドの一部が実行できなくなる可能性があります。
ロス

32

SQLiteは、ALTERTABLEの限定されたサブセットをサポートします。SQLiteのALTERTABLEコマンドを使用すると、ユーザーはテーブルの名前を変更したり、既存のテーブルに新しい列を追加したりできます。列の名前を変更したり、列を削除したり、テーブルに制約を追加または削除したりすることはできません。ただし、次の手順でテーブル列のデータ型またはその他のプロパティを変更できます。

  1. トランザクションの開始;
  2. CREATE TEMPORARY TABLE t1_backup(a、b);
  3. INSERT INTO t1_backup SELECT a、b FROM t1;
  4. ドロップテーブルt1;
  5. CREATE TABLE t1(a、b);
  6. INSERT INTO t1 SELECT a、b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. コミット

詳細については、リンクを参照してください


テーブルの名前を変更するには:ALTER TABLE table1 RENAME TO table2;
ライブラブ

インデックスを忘れないでください。.schemaを実行して、インデックス付きのcreateステートメントを生成します。
ライブラブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.