请问怎么在数据表中设置一个字段的默认值为另外一个字段

时间:2021-12-20 15:07:48
在mysql数据库中,加入一个数据表table。其中有两个字段id和name,其中id为主键,自动增长,现在我想把name字段的默认值改为与id一样,也就是说当我插入一条记录的时候,默认name与id是一样的,请问该怎么实现?

18 个解决方案

#1


仅用设置无法实现。不过可以使用触发器来实现这个功能。

mysql> create table t_rwxdfbb(id varchar(10),name varchar(10));
Query OK, 0 rows affected (0.38 sec)

mysql> delimiter |
mysql>
mysql> CREATE TRIGGER tr_rwxdfbb_bi BEFORE INSERT ON t_rwxdfbb
    ->   FOR EACH ROW BEGIN
    ->     if new.name is null then
    ->          set new.name=new.id;
    ->     end if;
    ->   END;
    -> |
Query OK, 0 rows affected (0.20 sec)

mysql>
mysql> delimiter ;
mysql>
mysql> insert into t_rwxdfbb (id) values ('rwxdfbb');
Query OK, 1 row affected (0.33 sec)

mysql> select * from t_rwxdfbb;
+---------+---------+
| id      | name    |
+---------+---------+
| rwxdfbb | rwxdfbb |
+---------+---------+
1 row in set (0.00 sec)

mysql> insert into t_rwxdfbb (id,name) values ('rwxdfbb2','xxxxxx');
Query OK, 1 row affected (0.06 sec)

mysql> select * from t_rwxdfbb;
+----------+---------+
| id       | name    |
+----------+---------+
| rwxdfbb  | rwxdfbb |
| rwxdfbb2 | xxxxxx  |
+----------+---------+
2 rows in set (0.00 sec)

mysql>

#2




id是主键, 自增

insert into table(name) values ('LAST_INSERT_ID()');

莫非这样不行 ?

#3


引用 2 楼 coolesting 的回复:
id是主键, 自增

 insert into table(name) values ('LAST_INSERT_ID()');

 莫非这样不行 ?


试了一下的确不行

#4


引用 1 楼 acmain_chm 的回复:
仅用设置无法实现。不过可以使用触发器来实现这个功能。

SQL codemysql>createtable t_rwxdfbb(idvarchar(10),namevarchar(10));
Query OK,0 rows affected (0.38 sec)

mysql> delimiter|
mysql>
mysql>CREATETRIGGER tr_rwxdfbb_bi BEFOREINSERTON t_rwxdfbb->FOR EACH ROWBEGIN->if new.nameisnullthen->set new.name=new.id;->endif;->END;->|
Query OK,0 rows affected (0.20 sec)

mysql>
mysql> delimiter ;
mysql>
mysql>insertinto t_rwxdfbb (id)values ('rwxdfbb');
Query OK,1 row affected (0.33 sec)

mysql>select*from t_rwxdfbb;+---------+---------+| id| name|+---------+---------+| rwxdfbb| rwxdfbb|+---------+---------+1 rowinset (0.00 sec)

mysql>insertinto t_rwxdfbb (id,name)values ('rwxdfbb2','xxxxxx');
Query OK,1 row affected (0.06 sec)

mysql>select*from t_rwxdfbb;+----------+---------+| id| name|+----------+---------+| rwxdfbb| rwxdfbb|| rwxdfbb2| xxxxxx|+----------+---------+2 rowsinset (0.00 sec)

mysql>
我按照相应做法试了下,发现不行啊,总是出现语法错误,在mysql命令台不行,在phpmyadmin中也不行,是怎么回事?

#5


mysql> select auto_increment from information_schema.tables where table_name='e'
;
+----------------+
| auto_increment |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

#6


引用
我按照相应做法试了下,发现不行啊,总是出现语法错误,在mysql命令台不行,在phpmyadmin中也不行,是怎么回事?


原因很简单你的语句没写正确!不过你不贴出你的语句,别人也猜不出你错在哪儿。

#7



CREATE TRIGGER tr_xinhong_bi BEFORE INSERT ON phome_ecms_audio
FOR EACH  ROW BEGIN 
SET new.name = new.id;
end;

MySQL 返回: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3 

#8


mysql>  delimiter |
mysql>
mysql> CREATE TRIGGER tr_rwxdfbb_bi BEFORE INSERT ON t_rwxdfbb
    ->   FOR EACH ROW BEGIN
    ->     if new.name is null then
    ->          set new.name=new.id;
    ->     end if;
    ->   END;
    ->  |
Query OK, 0 rows affected (0.20 sec)

mysql>
mysql> delimiter ;


建议你能象这样贴你的代码,否则猜不出你错在哪儿。

#9


mysql> use empirecms
Database changed
mysql> delimiter |
mysql> CREATE TRIGGER tr_xinhong_bi BEFORE INSERT ON phome_ecms_audio
    -> FOR EACH
    -> ROW BEGIN
    -> SET new.filename = new.id;
    -> end;
    -> |
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers
 with the same action time and event for one table'

#10


我的数据库可是5.1.30的啊

#11


好像是不支持在一个表中操作啊

#12


This version of MySQL doesn't yet support 'multiple triggers

你的表上已经有了一个触发器了,删除。

#13


引用 12 楼 acmain_chm 的回复:
This version of MySQL doesn't yet support 'multiple triggers

 你的表上已经有了一个触发器了,删除。

可以了,真是太谢谢了!又学到了一招
不过还有一个问题,因为我的id是自动增加的,所以我每次插入时没有管id这个字段,这样的话,name字段也没有值,必须要指定id的值,name才能生效,有没有什么办法实现全自动?

#14


引用 12 楼 acmain_chm 的回复:
This version of MySQL doesn't yet support 'multiple triggers

 你的表上已经有了一个触发器了,删除。

按照我的想法,每次插入记录的时候,不理会id和name,只插入其他字段,但是这样操作的结果是:id仍然递增,但是name却一直为0,我估计是插入前触发造成的,这个时候id并没有值,因此name也读不到值,我想改为after触发,发现有语法错误“Updating of NEW row is not allowed in after trigger”,这种情况该怎么实现?

#15


试了n次,还是无法将id的值给name

#16


请问怎么在数据表中设置一个字段的默认值为另外一个字段为什么一开始你不说明你的表结构?!

如果是auto_increment 则没有办法,只能在before insert 中 select max(id) 得到。

#17


学习

#18


最终是怎么样啊,
我现在也要实现这样的功能。

#1


仅用设置无法实现。不过可以使用触发器来实现这个功能。

mysql> create table t_rwxdfbb(id varchar(10),name varchar(10));
Query OK, 0 rows affected (0.38 sec)

mysql> delimiter |
mysql>
mysql> CREATE TRIGGER tr_rwxdfbb_bi BEFORE INSERT ON t_rwxdfbb
    ->   FOR EACH ROW BEGIN
    ->     if new.name is null then
    ->          set new.name=new.id;
    ->     end if;
    ->   END;
    -> |
Query OK, 0 rows affected (0.20 sec)

mysql>
mysql> delimiter ;
mysql>
mysql> insert into t_rwxdfbb (id) values ('rwxdfbb');
Query OK, 1 row affected (0.33 sec)

mysql> select * from t_rwxdfbb;
+---------+---------+
| id      | name    |
+---------+---------+
| rwxdfbb | rwxdfbb |
+---------+---------+
1 row in set (0.00 sec)

mysql> insert into t_rwxdfbb (id,name) values ('rwxdfbb2','xxxxxx');
Query OK, 1 row affected (0.06 sec)

mysql> select * from t_rwxdfbb;
+----------+---------+
| id       | name    |
+----------+---------+
| rwxdfbb  | rwxdfbb |
| rwxdfbb2 | xxxxxx  |
+----------+---------+
2 rows in set (0.00 sec)

mysql>

#2




id是主键, 自增

insert into table(name) values ('LAST_INSERT_ID()');

莫非这样不行 ?

#3


引用 2 楼 coolesting 的回复:
id是主键, 自增

 insert into table(name) values ('LAST_INSERT_ID()');

 莫非这样不行 ?


试了一下的确不行

#4


引用 1 楼 acmain_chm 的回复:
仅用设置无法实现。不过可以使用触发器来实现这个功能。

SQL codemysql>createtable t_rwxdfbb(idvarchar(10),namevarchar(10));
Query OK,0 rows affected (0.38 sec)

mysql> delimiter|
mysql>
mysql>CREATETRIGGER tr_rwxdfbb_bi BEFOREINSERTON t_rwxdfbb->FOR EACH ROWBEGIN->if new.nameisnullthen->set new.name=new.id;->endif;->END;->|
Query OK,0 rows affected (0.20 sec)

mysql>
mysql> delimiter ;
mysql>
mysql>insertinto t_rwxdfbb (id)values ('rwxdfbb');
Query OK,1 row affected (0.33 sec)

mysql>select*from t_rwxdfbb;+---------+---------+| id| name|+---------+---------+| rwxdfbb| rwxdfbb|+---------+---------+1 rowinset (0.00 sec)

mysql>insertinto t_rwxdfbb (id,name)values ('rwxdfbb2','xxxxxx');
Query OK,1 row affected (0.06 sec)

mysql>select*from t_rwxdfbb;+----------+---------+| id| name|+----------+---------+| rwxdfbb| rwxdfbb|| rwxdfbb2| xxxxxx|+----------+---------+2 rowsinset (0.00 sec)

mysql>
我按照相应做法试了下,发现不行啊,总是出现语法错误,在mysql命令台不行,在phpmyadmin中也不行,是怎么回事?

#5


mysql> select auto_increment from information_schema.tables where table_name='e'
;
+----------------+
| auto_increment |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

#6


引用
我按照相应做法试了下,发现不行啊,总是出现语法错误,在mysql命令台不行,在phpmyadmin中也不行,是怎么回事?


原因很简单你的语句没写正确!不过你不贴出你的语句,别人也猜不出你错在哪儿。

#7



CREATE TRIGGER tr_xinhong_bi BEFORE INSERT ON phome_ecms_audio
FOR EACH  ROW BEGIN 
SET new.name = new.id;
end;

MySQL 返回: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3 

#8


mysql>  delimiter |
mysql>
mysql> CREATE TRIGGER tr_rwxdfbb_bi BEFORE INSERT ON t_rwxdfbb
    ->   FOR EACH ROW BEGIN
    ->     if new.name is null then
    ->          set new.name=new.id;
    ->     end if;
    ->   END;
    ->  |
Query OK, 0 rows affected (0.20 sec)

mysql>
mysql> delimiter ;


建议你能象这样贴你的代码,否则猜不出你错在哪儿。

#9


mysql> use empirecms
Database changed
mysql> delimiter |
mysql> CREATE TRIGGER tr_xinhong_bi BEFORE INSERT ON phome_ecms_audio
    -> FOR EACH
    -> ROW BEGIN
    -> SET new.filename = new.id;
    -> end;
    -> |
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers
 with the same action time and event for one table'

#10


我的数据库可是5.1.30的啊

#11


好像是不支持在一个表中操作啊

#12


This version of MySQL doesn't yet support 'multiple triggers

你的表上已经有了一个触发器了,删除。

#13


引用 12 楼 acmain_chm 的回复:
This version of MySQL doesn't yet support 'multiple triggers

 你的表上已经有了一个触发器了,删除。

可以了,真是太谢谢了!又学到了一招
不过还有一个问题,因为我的id是自动增加的,所以我每次插入时没有管id这个字段,这样的话,name字段也没有值,必须要指定id的值,name才能生效,有没有什么办法实现全自动?

#14


引用 12 楼 acmain_chm 的回复:
This version of MySQL doesn't yet support 'multiple triggers

 你的表上已经有了一个触发器了,删除。

按照我的想法,每次插入记录的时候,不理会id和name,只插入其他字段,但是这样操作的结果是:id仍然递增,但是name却一直为0,我估计是插入前触发造成的,这个时候id并没有值,因此name也读不到值,我想改为after触发,发现有语法错误“Updating of NEW row is not allowed in after trigger”,这种情况该怎么实现?

#15


试了n次,还是无法将id的值给name

#16


请问怎么在数据表中设置一个字段的默认值为另外一个字段为什么一开始你不说明你的表结构?!

如果是auto_increment 则没有办法,只能在before insert 中 select max(id) 得到。

#17


学习

#18


最终是怎么样啊,
我现在也要实现这样的功能。