Tha*_*anh 4 mysql ruby-on-rails ruby-on-rails-3
我有模型项目和位置.
这是我的Item模型的迁移文件:
class CreateItems < ActiveRecord::Migration
def change
create_table :items do |t|
t.string :item_cd
t.string :item_name
t.integer :location_id
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
我使用form_tag创建一个表单来创建新项目.但是当我创建新Item时,Rails会生成如下SQL:
Location Load (0.3ms) SELECT `locations`.* FROM `locations` WHERE `locations`.`location_cd` = 'jp' LIMIT 1
Item Load (0.2ms) SELECT `items`.* FROM `items` WHERE `items`.`item_cd` = '6' LIMIT 1
(0.1ms) BEGIN
Item Exists (0.2ms) SELECT 1 FROM `items` WHERE `items`.`item_cd` = BINARY '6' LIMIT 1
SQL (0.6ms) INSERT INTO `items` (`created_at`, `item_cd`, `item_name`, `location_id`, `updated_at`) VALUES ('2013-04-17 03:26:42', '6', 'Glasses', 12, '2013-04-17 03:26:42')
(27.6ms) COMMIT
Run Code Online (Sandbox Code Playgroud)
为什么SQL BINARY
在Item Exists行中有?我插入一个字符串来在表单上创建item_cd.谁能告诉我什么问题?
我正在使用mysql数据库.
看起来您的模型中有一些验证
validates :item_cd, :uniqueness => true
Run Code Online (Sandbox Code Playgroud)
显然,这会使模型检查db中是否存在相等的值,因此Exist
查询.
字符串'6'在比较之前被转换为二进制文件的原因是二进制比较对于char
和varchar
值更快.通常,比较将通过整理过程,以便(例如)'6'='6'或'a'='A'.由于查询只需要检索完全匹配(也不是值,只是它们的存在:SELECT 1),二进制比较就足够了.
您还可以查看相关的MySQL文档:http: //dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html
归档时间: |
|
查看次数: |
1203 次 |
最近记录: |