質問

テーブルのエントリを制限したい。テーブルで tBoss としましょう。現在テーブルにあるタプルの数をチェックするSQL制約はありますか?いいね

SELECT COUNT(*) from tBoss < 2

Firebirdのコメント:

  

無効なトークン。   動的SQLエラー。   SQLエラーコード= -104。   トークンが不明-行3、列8。   SELECT。

ありがとう。ノーバート

役に立ちましたか?

解決

データベースにはトリガーがありますか?その場合、3行以上を追加する挿入をロールバックするトリガーを追加します...

Create Trigger MyTrigName
For Insert On tBoss
As
    If (Select Count(*) From tBoss) > 2
       RollBack Transaction

ただし、質問に直接答えるには、選択サブクエリをかっこ内に入れるだけです。このように...

  [First part of sql statement ]
  Where (SELECT COUNT(*) from tBoss) < 2

他のヒント

チェック制約とスカラー関数を使用してこれを行うことができます。サンプルの作成方法は次のとおりです。

最初に、テーブルを作成します:

CREATE TABLE MyTable
 (
   MyTableId  int           not null  identity(1,1)
  ,MyName     varchar(100)  not null
 )

次に、そのテーブルの関数を作成します。 (柔軟性を高めたい場合は、パラメータとして行数制限を追加できます。)

CREATE FUNCTION dbo.MyTableRowCount()
RETURNS int
AS
 BEGIN
    DECLARE @HowMany int

    SELECT @HowMany = count(*)
      from MyTable
    RETURN @HowMany
 END

この関数を使用してテーブルにチェック制約を追加します

ALTER TABLE MyTable
 add constraint CK_MyTable__TwoRowsMax
  check (dbo.MyTableRowCount() < 3)

そしてテスト:

INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')

不利な点は、テーブルに挿入するたびに、関数を実行し、テーブルスキャンを実行する必要があることです...しかし、テーブル(クラスター化インデックス付き)は最大2ページを占有します。本当の不利な点は、それがちょっと間抜けに見えることです...しかし、なぜそれがそのようにならなければならないのか理解していないとき、すべてが間抜けに見えます。

(トリガーソリューションは機能しますが、可能な限りトリガーを避けたいです。)

データベースで複数を見つけるための最善の策は、たとえばサブクエリです:(注:何らかの重複した行を探していると仮定していることに注意してください)

  

tBossからのidの選択WHERE id IN(tBossからのidの選択id by HAVING count(*)&gt; 1)

idは重複する可能性のある列です

SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top