sql >> データベース >  >> RDS >> PostgreSQL

postgresqlの最大行数に関する制約を作成するにはどうすればよいですか?

    Quassnoiは正しいです。トリガーはこれを達成するための最良の方法です。

    コードは次のとおりです:

    CREATE OR REPLACE FUNCTION enforce_photo_count() RETURNS trigger AS $$
    DECLARE
        max_photo_count INTEGER := 10;
        photo_count INTEGER := 0;
        must_check BOOLEAN := false;
    BEGIN
        IF TG_OP = 'INSERT' THEN
            must_check := true;
        END IF;
    
        IF TG_OP = 'UPDATE' THEN
            IF (NEW.owner != OLD.owner) THEN
                must_check := true;
            END IF;
        END IF;
    
        IF must_check THEN
            -- prevent concurrent inserts from multiple transactions
            LOCK TABLE photos IN EXCLUSIVE MODE;
    
            SELECT INTO photo_count COUNT(*) 
            FROM photos 
            WHERE owner = NEW.owner;
    
            IF photo_count >= max_photo_count THEN
                RAISE EXCEPTION 'Cannot insert more than % photos for each user.', max_photo_count;
            END IF;
        END IF;
    
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    
    
    CREATE TRIGGER enforce_photo_count 
        BEFORE INSERT OR UPDATE ON photos
        FOR EACH ROW EXECUTE PROCEDURE enforce_photo_count();
    

    2つの同時トランザクションがユーザーの写真をカウントし、現在のカウントが制限を1下回ることを確認してから、両方を挿入すると、制限を1超えてしまう状況を回避するために、テーブルロックを含めました。それが問題にならない場合は、多くの挿入/更新のボトルネックになる可能性があるため、ロックを解除することをお勧めします。



    1. ユーザー、スレッド、投稿を管理するための基本的なデータ構造のモデリング

    2. SQLServer複数の行の挿入を処理するためのトリガー

    3. 照合の不正な組み合わせMySQLエラー

    4. Oracleがサポートするバージョンマトリックス