私は文字列を持つテーブルを持っています。この列は、現在の行のテキスト+ IDで構成する必要があります。データベースによって生成されたID。例えば複合列(Id + string)
:行:(同上)12、(MYCOLUMN) 'abcde12'
それを行うための最善の方法は何ですか?私はNHibernateでそれを行うことはできますか、それともSQLでしかできないのでしょうか?
私は文字列を持つテーブルを持っています。この列は、現在の行のテキスト+ IDで構成する必要があります。データベースによって生成されたID。例えば複合列(Id + string)
:行:(同上)12、(MYCOLUMN) 'abcde12'
それを行うための最善の方法は何ですか?私はNHibernateでそれを行うことはできますか、それともSQLでしかできないのでしょうか?
私は、これは直接あなたの質問に答えるんことを知っているが、何の代わりに、このアプローチについて:
public virtual string MyCalculatedField {
get { return MyColumn + Id.ToString(); }
}
これを行うことにより、あなたがDBは、あなたのIDを生成した後にダブル更新を負担する必要はありません。
しかし、このデータベースを使用している人が、このフィールドを別のモデルやSQLクエリで読みたい場合はどうなりますか? – k0lpak
はい、このアプローチの制限です。 –
「データベースによって生成されたID」という意味に応じて、新しいレコードの挿入を2つの手順に分割する必要があります。
あなたのidはMySQLの自動インクリメントのようなものによって生成された場合、それは次のようになります。
Insert into your_table (some_text_col)
Values ('some_text')
をこれは、あなたがより
Update your_table
set combined = concat(some_text_col, id)
where id = LAST_INSERT_ID()
と、その列を更新することができ
ID some_text_col combined
1 'some_text' Null
を取得します
注:これはMySQLで動作するはずですが、テストしませんでした。他のDBMSにも容易に適応できます。 Update
を自動化するためにトリガー(DBがサポートしている場合)を使用することを検討することをお勧めします。
なぜ12
を2か所に保管しますか?
カラムに12
を、MyColumn
にabcde
を格納します。
取得する場合は、2つの値を連結したり、アプリケーションで必要なものを別々の列として取り出すことができます。それとも、View
を使用することができます。
CREATE VIEW Extra AS
(SELECT ID
, MyColumn
, CONCAT(ID, MyColumn) AS ExtraColumn
FROM TableX
) ;
次にあなたが使用することができます。
SELECT ExtraColumn FROM Extra
か:
SELECT * FROM Extra
は、あなたが同じで別の列から来挙げる「いくつかのテキストを」い表?そうでない場合は、新しいレコードを挿入する前に、「何らかのテキスト」がどのようになるか知っていますか? – gangreen
いいえ、クライアントから来ていません。クライアント上のいくつかの複雑なルールによって生成されたテキスト。 – k0lpak