1

単語ゲームの場合、配列にCHECK制約を追加しようとしています:VARCHAR

CREATE TABLE words_games (
        gid SERIAL PRIMARY KEY,
        created timestamptz NOT NULL,

        player1 integer REFERENCES words_users(uid) ON DELETE CASCADE NOT NULL,
        player2 integer REFERENCES words_users(uid) ON DELETE CASCADE,

        played1 timestamptz,
        played2 timestamptz,

        hand1 varchar[7] NOT NULL CHECK (ALL(hand1) ~ '^[*A-Z]$'),
        hand2 varchar[7] NOT NULL CHECK (ALL(hand2) ~ '^[*A-Z]$'),
        pile  varchar[116] NOT NULL CHECK (ALL(pile) ~ '^[*A-Z]$'),

        board varchar[15][15] NOT NULL CHECK (ALL(board) ~ '^[.A-Z]$'),
        style integer NOT NULL CHECK (1 <= style AND style <= 4)
);

しかし、構文エラーが発生します:

ERROR:  syntax error at or near "ALL"
LINE 8:         hand1 varchar[7] NOT NULL CHECK (ALL(hand1) ~ '^[A-Z...
                                                 ^

おそらく、ALLキーワードが右側にあるはずだからですか?

ここでチェック制約を実装する方法を誰かに勧めてもらえますか?

4

1 に答える 1

2

はい、all()またはany()関数を左比較引数として使用することはできません。代わりに関数を作成します:

create or replace function check_array_regexp_all(text[], text) returns boolean as $$
  select bool_and(x) from (select unnest($1) ~ $2 as x) t;
$$ language sql immutable;

それを制約に使用します。

...
hand1 varchar[7] NOT NULL CHECK (check_array_regexp_all(hand1, '^[*A-Z]$')),
...
于 2016-03-04T15:57:11.960 に答える