Sütunları name
olan bir masam var qty
,, rate
. Şimdi ve sütunları COLNew
arasına yeni bir sütun eklemem gerekiyor . İki sütun arasına nasıl yeni bir sütun ekleyebilirim?name
qty
Sütunları name
olan bir masam var qty
,, rate
. Şimdi ve sütunları COLNew
arasına yeni bir sütun eklemem gerekiyor . İki sütun arasına nasıl yeni bir sütun ekleyebilirim?name
qty
Yanıtlar:
İ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.
PRAGMA foreign_keys = ON;
(bkz. sqlite.org/foreignkeys.html#fk_enable )
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, select
onları 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)
SELECT * FROM mytable
?
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.
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'
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;
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, SELECT
sorguyu ç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 temptable
veya RENAME table
veya 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 .
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ı.