2011-08-01 78 views
0

我正在向MySQL表添加东西,每个项目都有一个position,它在我的系统中显示为问题编号。MySQL智能默认值

我可以找出最大的position在添加新问题之前是什么,然后添加它 - 但我想知道是否有更智能的方式,不需要第二个查询。

类似于INSERT INTO questions (id, position) values (0, MAX(position))

该字段不是主键,auto_increment对这种情况没有用。

我不能使用position作为关键,因为这个关键涉及很多其他的事情,并且position可以在任何时候改变。

我是一个非常有信心的MySQL查询作家,所以请不要提供任何建议,除了问的问题 - 我知道很多替代品,这只是一个语法问题。

我相信你会得到我的漂移!

干杯。

+0

像,一个自动递增的索引也许? –

+0

不幸的是,这个表格存在多个调查问题,所以对我来说效果不好。 – Alex

+0

您可以随时在插入时执行子查询,并将“COUNT”加1。 –

回答

0

使用auto_increment像大多数其他人一样吗?

这是智能的方式,因为它并发安全。

+0

我的'位置'字段不是关键,但我需要一个单独的键,因为可以随时更改位置 – Alex

+0

使用一个单独的表,然后有一个FK,它是当前表与另一个键的PK。但是,如果可以更改,那么如果有人插入967并且更新发生42到1432,会发生什么?它是独特的吗? – gbn

0

最好的方法是更改​​MySQL中的字段属性,这意味着让MySql在不提供输入的情况下完成工作。

TABLE TableName CHANGE positionposition INT(11)NOT NULL AUTO_INCREMENT

现在插入时,没有为这个领域提供的任何值。

INSERT INTO questions (var1, var2) values (val1,val2)

MySQL将自动递增的位置值。您可以设置当前计数器,并根据需要进行重置。这样你根本没有运行任何采石场。

+0

除了你只允许一个auto_increment字段,并且必须是主键。 – Alex

+1

auto_increment字段不必是主键。 – Tumharyyaaden

+0

'MySQL说: #1075 - 不正确的表定义;只能有一个自动列,并且必须将其定义为键' – Alex

0

这样的事情应该工作

INSERT INTO questions (id, position) SELECT 0, MAX(position)+1 FROM questions; 

显然,你将需要处理的0值,如将其设置为合适的东西,我只是复制了你的例子价值。

你也可以创建一个存储过程在查询中使用,或者甚至有一个触发器决定MAX(位置),添加一个并将其存储在新创建的行中。

很很多的选择那里,我会去的上述方案,但(与位置指数)

0

有没有办法设置一个默认值,具体的计算,它似乎。