2012-02-22 8 views
2

私は文字列を持つテーブルを持っています。この列は、現在の行のテキスト+ IDで構成する必要があります。データベースによって生成されたID。例えば複合列(Id + string)

:行:(同上)12、(MYCOLUMN) 'abcde12'

それを行うための最善の方法は何ですか?私はNHibernateでそれを行うことはできますか、それともSQLでしかできないのでしょうか?

+0

は、あなたが同じで別の列から来挙げる「いくつかのテキストを」い表?そうでない場合は、新しいレコードを挿入する前に、「何らかのテキスト」がどのようになるか知っていますか? – gangreen

+0

いいえ、クライアントから来ていません。クライアント上のいくつかの複雑なルールによって生成されたテキスト。 – k0lpak

答えて

0

私は、これは直接あなたの質問に答えるんことを知っているが、何の代わりに、このアプローチについて:

public virtual string MyCalculatedField { 
    get { return MyColumn + Id.ToString(); } 
} 

これを行うことにより、あなたがDBは、あなたのIDを生成した後にダブル更新を負担する必要はありません。

+0

しかし、このデータベースを使用している人が、このフィールドを別のモデルやSQLクエリで読みたい場合はどうなりますか? – k0lpak

+0

はい、このアプローチの制限です。 –

0

「データベースによって生成された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がサポートしている場合)を使用することを検討することをお勧めします。

+0

@@ IDENTITYはSQL Serverでのみ動作すると思います。 MySQLはLAST_INSERT_ID()を使用します。 – gangreen

+0

@gangreenそうです。ありがとう、ありがとう。 – TPete

0

なぜ12を2か所に保管しますか?

カラムに12を、MyColumnabcdeを格納します。

取得する場合は、2つの値を連結したり、アプリケーションで必要なものを別々の列として取り出すことができます。それとも、Viewを使用することができます。

CREATE VIEW Extra AS 
(SELECT ID 
     , MyColumn 
     , CONCAT(ID, MyColumn) AS ExtraColumn 
    FROM TableX 
) ; 

次にあなたが使用することができます。

SELECT ExtraColumn FROM Extra 

か:

SELECT * FROM Extra 
関連する問題