我有一个主键是一个varchar(255)的表.出现了一些情况,其中255个字符是不够的.我尝试将字段更改为文本,但是我收到以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
编辑:我还应该指出这个表有一个包含多列的复合主键.
我在Rails 2.3.2应用程序中使用MySQL全文索引.我在迁移中通过本机SQL添加了索引.但是有一个已知问题导致schema.rb出现问题.Rails不了解全文索引并尝试创建普通索引.从schema.rb创建数据库时会出错(例如测试,规格等):
Mysql::Error: BLOB/TEXT column 'text' used in key specification without a key length: CREATE INDEX `fulltext_sms` ON `sms` (`text`)
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有猴子修补Rails的情况下在Rails 2.3.2中解决这个问题?如果没有,最好的方法是什么?
谢谢!
我的迁移:
class FulltextIndexCustomersSmsMessage < ActiveRecord::Migration
def self.up
execute('ALTER TABLE sms ENGINE = MyISAM')
execute('ALTER TABLE customers ENGINE = MyISAM')
execute('CREATE FULLTEXT INDEX fulltext_sms ON sms (text(500))')
execute('CREATE FULLTEXT INDEX fulltext_customer ON customers (fullname(255))')
end
def self.down
execute('ALTER TABLE sms ENGINE = innodb')
execute('ALTER TABLE customers ENGINE = innodb')
execute('DROP INDEX fulltext_sms ON sms')
execute('DROP INDEX fulltext_customer ON …Run Code Online (Sandbox Code Playgroud) 我正在尝试将复合主键添加到类中并遇到一些麻烦.这是课程.
class User {
private long id;
...
}
class Token {
private User user;
private String series;
...
}
Run Code Online (Sandbox Code Playgroud)
我正在使用orm.xml来映射类,因为它们实际上是我不想依赖JPA的更高级API的一部分 - 它有许多实现.
这里是:
...
<entity class="User">
<attributes>
<id name="id">
<generated-value strategy="AUTO"/>
</id>
...
</attributes>
</entity>
<entity class="Token">
<id-class class="TokenPK"/>
<attributes>
<id name="series"/>
<id name="user"/>
<many-to-one name="user"/>
</attributes>
</entity>
Run Code Online (Sandbox Code Playgroud)
最后为了使它全部工作,我创建了TokenPK类,它看起来像这样:
public class TokenPK implements Serializable {
private String series;
private User user;
public TokenPK() {
}
public TokenPK(String series, User user) {
this.series = series;
this.user = user;
}
public …Run Code Online (Sandbox Code Playgroud) 这是我的模型的一部分:
@Entity
public class Entry
{
@Id @GeneratedValue
private long identifier;
@ElementCollection
@Column(nullable = false)
private Map<String, String> titles;
@ElementCollection
@Column(nullable = false)
@Lob
private Map<String, String> contents;
// Getters and setters, other fields and methods
}
Run Code Online (Sandbox Code Playgroud)
我使用@Lob注释,因为map"contents"的值可能很大.请注意,我不关心映射"contents"的键如何映射到数据库.我只是找不到一种方法来指定@Lob注释应该只应用于地图的值.
虽然Entry.titles没有问题地映射到数据库,但Entry.contents却没有.没有创建数据库表,MySQL/Hibernate抱怨:
Unsuccessful: create table myblog.Entry_contents (Entry_identifier bigint not null, contents longtext not null, contents_KEY longtext, primary key (Entry_identifier, contents_KEY)) type=InnoDB
BLOB/TEXT column 'contents_KEY' used in key specification without a key length
Run Code Online (Sandbox Code Playgroud)
任何想法都表示赞赏!
当前列是VARCHAR(255)NOT NULL,那么如何将其更改为TEXT NOT NULL?
注意:要更改其属性类型的列是另一列的UNIQUE KEY组合.例如
独特的钥匙(名称,描述)
列描述当前在varchar(255)中.由于这个原因,它无法改变:
错误1170(42000):BLOB/TEXT列'描述'在密钥规范中使用,没有密钥长度
我需要它是TEXT,否则我需要重新创建整个事情?我已经收到了一些繁琐而重要的数据.重新创建会很麻烦.