189

SQLiteのWebサイトで構文「チャート」を見つけることができますが、例がなく、コードがクラッシュしています。1つの列に固有の制約を持つ他のテーブルがありますが、2つの列のテーブルに制約を追加したいと思います。これが、「構文エラー」というメッセージとともにSQLiteExceptionを引き起こしている原因です。

CREATE TABLE name (column defs) 
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE

私はこれを以下に基づいて行っています:

テーブル制約

明確にするために、私が提供したリンクのドキュメントにはCONTSTRAINT name、制約定義の前にあるべきだと書かれています。

しかし、解決策につながる可能性があるのは、括弧で囲まれた列の定義に続くものはすべて、デバッガーが文句を言うものであるということです。

入れたら

...last_column_name last_col_datatype) CONSTRAINT ...

エラーは「CONSTRAINT」の近くにあります:構文エラー

入れたら

...last_column_name last_col_datatype) UNIQUE ...

エラーは「UNIQUE」の近くにあります:構文エラー

4

5 に答える 5

363

UNIQUE宣言を列定義セクション内に配置します。実例:

CREATE TABLE a (
    i INT,
    j INT,
    UNIQUE(i, j) ON CONFLICT REPLACE
);
于 2010-04-23T20:50:47.717 に答える
10

さて、あなたの構文はあなたが指定したリンクと一致しません:それは以下を指定します:

 CREATE TABLE name (column defs) 
    CONSTRAINT constraint_name    -- This is new
    UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
于 2010-04-23T20:48:15.897 に答える
9

すでにテーブルがあり、何らかの理由でテーブルを再作成できない/したくない場合は、インデックスを使用してください。

CREATE UNIQUE INDEX my_index ON my_table(col_1, col_2);
于 2020-04-29T16:28:20.513 に答える
1

テーブルの定義方法に注意してください。挿入時に異なる結果が得られます。次のことを考慮してください



CREATE TABLE IF NOT EXISTS t1 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT);
INSERT INTO t1 (a, b) VALUES
    ('Alice', 'Some title'),
    ('Bob', 'Palindromic guy'),
    ('Charles', 'chucky cheese'),
    ('Alice', 'Some other title') 
    ON CONFLICT(a) DO UPDATE SET b=excluded.b;
CREATE TABLE IF NOT EXISTS t2 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT, UNIQUE(a) ON CONFLICT REPLACE);
INSERT INTO t2 (a, b) VALUES
    ('Alice', 'Some title'),
    ('Bob', 'Palindromic guy'),
    ('Charles', 'chucky cheese'),
    ('Alice', 'Some other title');

$ sqlite3 test.sqlite
SQLite version 3.28.0 2019-04-16 19:49:53
Enter ".help" for usage hints.
sqlite> CREATE TABLE IF NOT EXISTS t1 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT);
sqlite> INSERT INTO t1 (a, b) VALUES
   ...>     ('Alice', 'Some title'),
   ...>     ('Bob', 'Palindromic guy'),
   ...>     ('Charles', 'chucky cheese'),
   ...>     ('Alice', 'Some other title') 
   ...>     ON CONFLICT(a) DO UPDATE SET b=excluded.b;
sqlite> CREATE TABLE IF NOT EXISTS t2 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT, UNIQUE(a) ON CONFLICT REPLACE);
sqlite> INSERT INTO t2 (a, b) VALUES
   ...>     ('Alice', 'Some title'),
   ...>     ('Bob', 'Palindromic guy'),
   ...>     ('Charles', 'chucky cheese'),
   ...>     ('Alice', 'Some other title');
sqlite> .mode col
sqlite> .headers on
sqlite> select * from t1;
id          a           b               
----------  ----------  ----------------
1           Alice       Some other title
2           Bob         Palindromic guy 
3           Charles     chucky cheese   
sqlite> select * from t2;
id          a           b              
----------  ----------  ---------------
2           Bob         Palindromic guy
3           Charles     chucky cheese  
4           Alice       Some other titl
sqlite> 

挿入/更新の効果は同じですがid、テーブル定義タイプに基づいて変更されます(「アリス」が現在ある2番目のテーブルを参照してくださいid = 4。最初のテーブルは私が期待することをより多く実行しているので、主キーを同じに保ちます)。この影響に注意してください。

于 2019-06-16T18:39:36.247 に答える
0

私のために働く

create table projects (
    _id integer primary key autoincrement,
    project_type text not null,
    name text not null,
    description text,
    last_updated datetime default current_timestamp,
    date_created datetime default current_timestamp,
    unique (project_type, name)
);
于 2021-10-25T11:37:01.680 に答える