3

自動インクリメント フィールドと別のフィールドが入力されたテーブルがありますVARCHAR。挿入クエリで、文字列フィールドに新しく生成された ID を直接入力したいと思います。たとえば、テーブルの場合:

Person
(
    id auto_increment, 
    name varchar
)

次のようなクエリを実行したいと思います。

INSERT INTO Person(name) VALUE ('Person #' + ROWID())

とにかくこれを行うには?

4

5 に答える 5

3

これは、最後に挿入された行 ID を 1 ずつ増やして使用し、次の人物 ID を生成します。データベースへの同時挿入を行うべきではないことに注意してくださいlast_insert_rowid()

INSERT INTO Person (name) SELECT 'Person #' || (last_insert_rowid()+1);

または、これは現在持っている最大の ID を読み取り、+1 をインクリメントしてから、テキストと連結します。null を返す場合は 1 を使用します。

INSERT INTO Person (name) SELECT 'Person #' || (IFNULL((MAX(id)+1),1)) FROM Person LIMIT 1;

これは自動インクリメントのインデックスを取得します:

INSERT INTO Person (name) SELECT 'Person #' || (seq+1) FROM sqlite_sequence WHERE name="person"

次のようなこともできます。

INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
UPDATE Person SET name = 'Person #' || id WHERE name IS NULL;

または:

INSERT INTO Person (name) VALUES ('Person');
UPDATE Person SET name = name || ' #' || id WHERE id = last_insert_rowid();

#これは、行 ID を持つ a を持たない名前を更新します。

INSERT INTO Person (name) VALUES ('Person');
INSERT INTO Person (name) VALUES ('Person');
INSERT INTO Person (name) VALUES ('Person');
INSERT INTO Person (name) VALUES ('Person');
UPDATE Person SET name = name || ' #' || id WHERE (LENGTH(name)-LENGTH(REPLACE(name, '#', ''))) = 0;

ライブデモ

于 2013-08-22T16:12:06.283 に答える
2

同じ情報を 2 回保存しないでください。クエリを実行するときに、必要な文字列を動的に生成するだけです。

SELECT name || '#' || id FROM Person
于 2013-08-22T16:10:31.223 に答える
1

ID行が挿入されるまで、システムはそれを確実に認識しません。最良の解決策はビューだと思います(SQLiteは計算された列をサポートしていないため、これが最も簡単な方法です)。を挿入し、ビューを使用して、挿入された と割り当てられVARCHARた を使用して、リクエスト時に連結された値を構築するだけです。VARCHARID

幸運を!

于 2013-08-22T16:11:52.167 に答える
1

INSERT + UPDATE の 2 つの文を実行する必要があります。現在の挿入文の最後の挿入 ID にアクセスすることはできません。

于 2013-08-22T16:10:16.737 に答える
0

これは保証されませんが、これはうまくいくかもしれません...

INSERT INTO tab1(val) VALUES ('tab1 #' + cast((SELECT top 1 IDENT_CURRENT('tab1') + IDENT_INCR('tab1') FROM tab1) as varchar(20)))
于 2013-08-22T16:10:35.940 に答える