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编号中包含唯一编号。
答案 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 UPDATE
或AFTER 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 |
+--------+------+------+