Sqlite tabloya yeni sütun eklemek?


354

Sütunları nameolan bir masam var qty,, rate. Şimdi ve sütunları COLNewarasına yeni bir sütun eklemem gerekiyor . İki sütun arasına nasıl yeni bir sütun ekleyebilirim?nameqty

Yanıtlar:


677

İki seçeneğiniz var. İlk olarak, aşağıdakileri içeren yeni bir sütun ekleyebilirsiniz:

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

İkincisi ve daha karmaşık bir şekilde, ancak aslında sütunu istediğiniz yere koyarsanız, tabloyu yeniden adlandırmak olacaktır:

ALTER TABLE {tableName} RENAME TO TempOldTable;

Sonra yeni sütunu eksik sütunla oluşturun:

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

Ve eski verilerle doldurun:

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

Ardından eski tabloyu silin:

DROP TABLE TempOldTable;

Gerekirse her şeyi tamamen yeniden adlandırmanıza izin vereceğinden, ikinci seçeneği çok tercih ederim.


27
Ben ilk seçenek için gitmek istiyorum ve varsayılan seçeneği kullanma seçeneği dışında ALTER TABLE {tableName} ADIM SÜTUN KOLONU Yeni {type} DEFAULT {defaultValue}; Daha da önemlisi: (sütunları neden sipariş etmek istediğinizi düşünmek ..) her kayıt eyleminde (ekleme veya ekleme gibi) her zaman sütun adlarını kullanın, bu şekilde, tabloyu değiştirdikten sonra kodunuzda hiçbir zaman hata almazsınız.
michel.iamit

5
Bu arada: bazı alan türleri için ALTER TABLE'a varsayılan değer eklenemez: sqlite.org/lang_altertable.html
michel.iamit 9:00 '

9
dizinleri yeniden oluşturmayı unutmayın
Jan Turoň

5
ayrıca tetikleyicileri yeniden oluşturmanız gerekecek
Christopher K.

7
Yabancı anahtarların neden olabileceği olası kısıtlama ihlallerini unutmayın: "... ancak yabancı anahtar eylemlerini veya kısıtlama ihlallerini tetikleyebilir." (bkz. sqlite.org/foreignkeys.html#fk_schemacommands ); geçici bir çözüm olarak bu arada yabancı anahtarları devre dışı bırakabilirsiniz: PRAGMA foreign_keys = ON;(bkz. sqlite.org/foreignkeys.html#fk_enable )
Trinimon

112

SQL'deki diğer sütunlar arasına sütun eklemezsiniz, sadece onları eklersiniz. Kondukları yer tamamen DBMS'ye kalmış. Sütunların doğru sırada çıkmasını sağlamak için doğru yer, selectonları oluşturduğunuz zamandır.

Başka bir deyişle, onları sırayla {name,colnew,qty,rate}istiyorsanız, şunu kullanırsınız:

select name, colnew, qty, rate from ...

SQLite ile aşağıdakileri kullanmanız gerekir alter table:

alter table mytable add column colnew char(50)

2
SELECT * FROM mytable?
EML

Mevcut yeni sütun satırlarında belirtmezsek varsayılan değer nedir?
Jacob

12
Hiç yapmamanız gereken çok az kullanım durumu vardır select *. Bazen tabloların keşfini yapmak isteyen programlar için kullanışlıdır, ancak kullanımların büyük çoğunluğu için ne istediğinizi ve dolayısıyla hangi sırayı istediğinizi açıkça belirtmelisiniz.
paxdiablo

4
Bunun "kabul edilen cevap" olmaması delilik. Orijinal sorunun kendisi, bir RDBMS'nin nasıl çalıştığının tam olarak anlaşılmadığını gösterir.
Vada Poché

12

Sorgu ile yeni sütun ekleyebilirsiniz

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

Ancak, mevcut sütunlar arasına değil, sonuna eklenecektir.


11

SQLite, tablonun sonuna sütun eklemek veya tablonun adını değiştirmek için kullanabileceğiniz sınırlı ALTER TABLE desteğine sahiptir.

Bir tablonun yapısında daha karmaşık değişiklikler yapmak istiyorsanız, tabloyu yeniden oluşturmanız gerekir. Mevcut verileri geçici bir tabloya kaydedebilir, eski tabloyu bırakabilir, yeni tablo oluşturabilir ve ardından verileri geçici tablodan tekrar kopyalayabilirsiniz.

Örneğin, "a" ve "c" sütun adlarına sahip "t1" adlı bir tablonuz olduğunu ve bu tablodan "b" sütununu eklemek istediğinizi varsayalım. Aşağıdaki adımlar bunun nasıl yapılabileceğini göstermektedir:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

Artık yeni verilerinizi şu şekilde eklemeye hazırsınız:

UPDATE t1 SET b='blah' WHERE a='key'

Testlerimde satır INSERT INTO t1 SELECT a,c FROM t1_backup;şu hataya neden oluyor: "t1 tablosunun 3 sütunu var, ancak 2 değer sağlandı: t1 SELECT a, c FROM t1_backup;". Doğru satırINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
JnLlnd

5
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

Bu güncelleştirme, null değerini işlemek ve istediğiniz gibi varsayılan bir değer girmek için gereklidir. Sizin durumunuzda olduğu gibi, SELECTsorguyu çağırmanız gerekir ve paxdiablo'nun zaten söylediği gibi sütunların sırasını alırsınız :

SELECT name, colnew, qty, rate FROM{tablename}

ve bence, imleçten değer almak için sütun adınız:

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));

böylece dizin değişirse uygulamanız herhangi bir sorunla karşılaşmaz.

Bu, aksi takdirde, CREATE temptableveya RENAME tableveya kullanıyorsanız CREATE, dikkatli bir şekilde ele alınmazsa, örneğin piliniz bittiğinde işlemlerinizin gerçekleşmesi durumunda yüksek veri kaybı şansı olması açısından güvenli yoldur .


4

Aynı sorunla karşı karşıya kaldım ve kabul edilen cevapta önerilen ikinci yöntem, yorumlarda belirtildiği gibi, yabancı anahtarlarla uğraşırken sorunlu olabilir.

Geçici çözümüm INSERT deyimlerinin sütun adlarını içerdiğinden emin olarak veritabanını bir sql dosyasına aktarmaktır. Bunun için kullanışlı bir özelliği olan SQLite için DB Browser kullanarak yapıyorum . Bundan sonra, tablo oluştur ifadesini düzenlemeniz ve yeni sütunu istediğiniz yere eklemeniz ve db'yi yeniden oluşturmanız yeterlidir.

* Nix benzeri sistemlerde sadece

cat db.sql | sqlite3 database.db

Bunun çok büyük veritabanları ile ne kadar mümkün olduğunu bilmiyorum, ama benim durumumda çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.