問題タブ [default-constraint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - Db2 の列からデフォルトの制約を削除する方法
STUDENT_ID、NAME、AGE列を持つテーブルSTUDENT_TBがありました。次のコマンドで列を追加しました:-
DOB列に関しては、nullにしたくありませんでした。ここで、そのデフォルトの制約を削除する必要があります。
検索してみましたが、成功しませんでした。
よろしく。
c# - 列のデフォルトの制約が存在することを確認する方法は?
テーブル名と列名のデータだけでなく、列にすでにデフォルトの制約があることを確認したいと思います。そのレコード数を使用して、制約を作成できます。
データセット内のその列に制約が存在することを確認する他のプロパティはありますか?
c# - C# を取得してデフォルトを SQL Server に挿入する
テーブルのデフォルトの制約として SQL Server に格納されている値を優先して、一部の値を無視する必要があるように、SQL Serverに値INSERT
を格納するにはどうすればよいですか? string[]
これらのデフォルトを使用するには、何を渡す必要がありますか (NULL など)。
現在、コードにすべてのデフォルトを追加していますが、かさばります。
以下は私のコードです:
特定Parameter.Value
が null ではなく、SQL Server によって既定値が設定されている場合、このコードは null では機能しません。
SQL Server では、insert ステートメントで値を省略することでこれを処理します (この省略により、テーブルの既定値が挿入されますが、null を指定するとエラーが発生します)。
sql - SQL Server DEFAULT FOR 構文
SQL Server 2012 がレポートするように、'for' の近くに構文エラーがあるのはなぜですか?
テーブルの作成時と変更時に DEFAULT FOR 構文を使用できませんか? これは、テーブルの変更とデフォルトの制約リンクの追加に関するチュートリアルですが、作成時に正しく取得できません。
c# - INSERT 中にデータベースで DEFAULT CONSTRAINT を処理するように EF 6 を取得する方法
私は EF (最初の 1 週間) は初めてですが、データベースやプログラミングは初めてではありません。他の人も同様の質問をしていますが、説明が必要なほど適切な詳細で質問されたり、説明されたりしているとは思わないので、ここに行きます.
質問: INSERT の実行時に DEFAULT CONSTRAINT が定義されているデータベース内の列を Entity Framework で適切に処理するにはどうすればよいですか? つまり、挿入操作中にモデルに値を指定しない場合、データベース定義の DEFAULT CONSTRAINT が機能するように、生成された TSQL INSERT コマンドからその列を EF に除外させるにはどうすればよいでしょうか?
バックグラウンド
Entity Framework 6 (EF6) と、SQL Server が更新できる列との相互作用をテストするためだけに、作成した単純なテーブルがあります。これは、IDENTITY、TIMESTAMP、COMPUTED、および DEFAULT CONSTRAINT が適用されたいくつかの列を利用します。
EF6 は、IDENTITY、TIMESTAMP、および COMPUTED 列を完全に処理します。つまり、INSERT または UPDATE (経由context.SaveChanges()
) の後、EF は新しい値をエンティティ オブジェクトに読み込んで、すぐに使用できるようにします。
ただし、これは DEFAULT CONSTRAINT を持つ列では発生しません。そして、私が知る限り、これは、EF が TSQL を生成して INSERT を実行するときに、その列に DEFAULT CONSTRAINT が定義されていないかのように、null 許容型または null 非許容型に共通の既定値を提供するためです。したがって、EF が DEFAULT CONSTRAINT の可能性を完全に無視していることは明らかです。
DBUpdateTest レコードを挿入する EF コードを次に示します (単一の列のみを更新します)。
これは、DBUpdateTest への INSERT 中に EF によって生成された SQL です (可能なすべての列を忠実に更新します)。
INT NOT NULL (0) とINT NULL (null)のデフォルト値を非常に明確に提供していることに注意してください。これにより、DEFAULT CONSTRAINT が完全に克服されます。
これは、EF INSERT コマンドが実行されたときに起こることであり、null 許容列に NULL を指定し、INT 列に ZERO を指定します。
一方、次のステートメントを実行すると:
私はそのようなレコードを取得します
これが期待どおりに機能する理由の 1 つは、TSQL INSERT コマンドが定義済みの DEFAULT CONSTRAINT を持つ列の値を提供しなかったことです。
したがって、私がやろうとしているのは、モデル オブジェクトで明示的に値を設定しない場合、EF に DEFAULT CONSTRAINT 列を INSERT TSQL から除外させることです。
すでに試したこと
1. デフォルトの制約を認識していますか? SO: EF にデフォルトの制約を処理させる方法
私のクラスのOnModelCreating()
メソッドではDbContext
、DEFAULT CONSTRAINT を持つ列が COMPUTED フィールドであることを EF に伝えることができることが推奨されましたが、そうではありません。ただし、INSERTの後にEFが少なくとも値を読み戻すかどうかを確認したかったのです(それによって、その列に値を割り当てることができなくなる可能性があることも気にしないでください。ほしくない):
これは機能せず、実際には何も変わらないように見えます ( ED: 実際には機能します。ポイント 2 を参照してください)。EF は引き続き同じ TSQL を生成し、列の既定値を提供し、その過程でデータベースを無効にします。
不足しているフラグ、設定するのを忘れている構成項目、使用できる関数属性、作成できる継承されたクラス コードはありますか?
2. OnModelCreating() を取得して実行しますか? SO: OnModelCreating が呼び出されない
Janesh (以下) は、列が でマークされている場合、EFが生成された TSQL INSERT コマンドからパラメーターを削除することを示しましたDatabaseGeneratedOption.Computed
。明らかに間違った種類の接続文字列を使用していたため、うまくいきませんでした(!!!)。
これが私の App.config で<connectionStrings>
、「悪い」接続文字列と「良い」接続文字列を示すセクションは次のとおりです。
違い: 機能するものはのProviderNameを使用System.Data.SqlClient
し、機能しないものは を使用しSystem.Data.EntityClient
ます。どうやら SqlClient プロバイダーはOnModelCreating()
メソッドを呼び出すことを許可しているようです。これにより、私の使用がDatabaseGeneratedOption.Computed
効果を発揮します。
========== まだ解決されていません ==========
列に対する DEFAULT CONSTRAINTS の目的は、値を提供する (または提供しない) ことを許可し、それでもデータベース側で有効な値になるようにすることです。SQL Server がこれを行っていることを知る必要はありません。また、既定値が何であるか、またはそうあるべきかを知る必要もありません。これは、私の制御または知識の範囲外で完全に発生します。
ポイントは、値を指定しないという選択肢があるということです。必要に応じて、INSERT ごとに別の方法で提供することもできます。
この場合、使用DatabaseGeneratedOption.Computed
は実際には有効なオプションではありません。これは、「常に値を提供できる (したがって、データベースの既定のメカニズムを決して利用しない) か、値を決して提供できない (したがって、常にデータベースの既定のメカニズムを利用する)」という選択を迫られるためです。 )」。
さらに、このオプションは、DEFAULT CONSTRAINT を持つ列ではなく、実際の計算列でのみ使用することを明確に意図しています。これは、モデル プロパティが適用されると、INSERT および UPDATE の目的で実質的に読み取り専用になるためです。動作します。明らかに、これは、データベースに値を提供するかどうかの私の選択の妨げになります。
それで、私はまだ尋ねます:DEFAULT CONSTRAINTが定義されているデータベース列でEFを「正しく」動作させるにはどうすればよいですか?
sql-server - DEFAULT CONSTRAINT 完全な形式
各テーブルの制約には、省略形、準省略形、および完全な形式があることがわかります (命名についてはご容赦ください。それらを正しく呼び出す方法の提案を歓迎します)。
例えば
省略形: 制約名は SQL Server によって定義されます。影響を受ける列は、定義されている列として暗示されます。
準省略形: 明示的な制約名、暗黙の列
完全な形式 : どちらも明示的です。列の定義とは別に、最後に定義を許可する
私が見たALTER TABLE
ところ、完全な形式は でよく見られ、制約は後で定義されます。
DEFAULT
拘束用
省略形
半省略形
ALTER TABLE
as hereでフルフォームの使用が見られます
ただし、テーブル作成時のフルフォーム定義は失敗する
エラーあり
メッセージ 102、レベル 15、状態 1、行 5 'for' 付近の構文が正しくありません。
このエラーが発生する理由と、デフォルト制約の完全な定義を使用する方法を誰かが提案できますか?
sql - デフォルトの制約から値を取得する
デフォルトの制約値を 0 から 1 に変更する必要があります。これは次の方法で簡単に実行できます。
問題は、データベースで modelupdate を実行するたびに新しい制約を削除して作成したくないことです。そのため、制約の値が 0 の場合にこのコードを実行したいと考えています。
SQL でデフォルトの制約の値を確認することは可能ですか?