MySQL自动填充基于另一个字段的数字字段

时间:2017-01-19 16:44:05

标签: mysql

mysql问题...所以我想自动填充一个数字,但我希望它基于另一个字段。除了使用这个例子之外,我不确定如何解释它:

Field 1 | Field 2 (auto populate)
   1    |   1
   2    |   1
   2    |   2
   2    |   3
   3    |   1
   3    |   2
   2    |   4
   2    |   5

是否有可以添加到列中的mysql函数表达式?

我知道我可以在我的Python脚本中执行此操作,但是我必须假设如果将函数放入mysql中它会更快。

更新 让我补充一些澄清......

字段1将填充脚本中的值。

字段1的多个条目具有相同的编号。

我希望字段2自动填充以在字段1编号中包含唯一编号。

4 个答案:

答案 0 :(得分:1)

您可以使用以下用户变量将field1和generate2生成为每个field1中增加的整数值:

select
    t.field1,
    @rn := if(field1 = @f1, @rn + 1, if(@fi := field1, 1, 1)) field2
from (
    select
        t.*
    from your_table t
    order by field1   --very important
) t cross join (select @rn := 0, @f1 := -1) t2

答案 1 :(得分:0)

您可以使用触发器,该触发器是在某些条件下自动运行的功能。 这是手册http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html。 例如,您可以使用AFTER UPDATEAFTER INSERT触发器来实现此目的。

答案 2 :(得分:0)

您可能想要创建trigger。如下所示:

CREATE TRIGGER `populate_field_2` BEFORE INSERT ON `table_name` FOR EACH ROW BEGIN
    DECLARE _new_val INT DEFAULT 0;
    SELECT MAX(field_2)+1 INTO _new_val FROM 'table_name' WHERE field_1 = NEW.field_1;
    SET NEW.field_2 = _new_val;
END

每次创建新行时,都会填充field_2。您可以更新逻辑以为您需要的field2创建任何值。

答案 3 :(得分:0)

撇开与MyISAM表相关的常见警告......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(field1 INT NOT NULL 
,field2 INT NOT NULL AUTO_INCREMENT
,PRIMARY KEY(field1,field2)
) ENGINE = MyISAM;

INSERT INTO my_table (field1) VALUES
(1),(2),(2),(2),(3),(3),(2),(2);

SELECT * FROM my_table;

+--------+--------+
| field1 | field2 |
+--------+--------+
|      1 |      1 |
|      2 |      1 |
|      2 |      2 |
|      2 |      3 |
|      2 |      4 |
|      2 |      5 |
|      3 |      1 |
|      3 |      2 |
+--------+--------+

..但我会质疑是否真的存在这种信息的任何意义......

...因此,一种更强大的方法......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(field1 INT NOT NULL 
,field2 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE = InnoDB;

INSERT INTO my_table (field1) VALUES
(1),(2),(2),(2),(3),(3),(2),(2);

SELECT x.field1
     , CASE WHEN @prev = field1 THEN @i:=@i+1 ELSE @i:=1 END i 
     , @prev:=field1 prev
  FROM my_table x
     , (SELECT @prev:=null,@i:=0) vars
 ORDER
    BY field1
     , field2;

+--------+------+------+
| field1 | i    | prev |
+--------+------+------+
|      1 |    1 |    1 |
|      2 |    1 |    2 |
|      2 |    2 |    2 |
|      2 |    3 |    2 |
|      2 |    4 |    2 |
|      2 |    5 |    2 |
|      3 |    1 |    3 |
|      3 |    2 |    3 |
+--------+------+------+