2012-08-09 9 views
6

h2を使用しているため、h2を使用して次のスクリプトを実行しようとしています。私は次のスクリプトで別のテーブルを作成した場合h2データベースを使用したテーブルの作成

CREATE TABLE acct_authority (
    id bigint(20) NOT NULL auto_increment, 
    name varchar(255) NOT NULL default '', 
    value varchar(255) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY name (name) 
); 

テーブルacct_authorityは、任意のerror.Butなしで作成されます。

CREATE TABLE acct_role (
    id bigint(20) NOT NULL auto_increment, 
    name varchar(255) NOT NULL default '', 
    PRIMARY KEY (id), 
    UNIQUE KEY name (name) 
); 

制約名が既に存在するためエラーが表示されます。間違いをしました。

答えて

10

同じ名前の2つの制約を作成しようとしました。ご覧のとおり、次の両方含まれているCREATE TABLE文:

UNIQUE KEY name (name) 

結果は、最初のものは名前という名前の制約を作成し、制約名前がすでに存在しているため、2番目のいずれかに障害が発生したということです。問題は一意の名前を使用することで解決できます。一般的には、データベースオブジェクトの名前を少し分かりやすくすることが理にかなっています。たぶん次のようなものを使用することができます:

UNIQUE KEY acct_authority_name_UNIQUE (name) 
    ... 
    UNIQUE KEY acct_role_name_UNIQUE (name) 
+2

はい、それは問題です。私は追加したかったのですが、一意でない制約名をサポートする唯一のデータベースはMySQLです(制約名はテーブル内で一意である必要があります)。他のすべてのデータベースでは、スキーマ内で一意の制約名が必要です。 –

関連する問題