SQL制約の検索:tBoss<のSELECT COUNT(*) 2
-
06-07-2019 - |
質問
テーブルのエントリを制限したい。テーブルで 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