我有一个问题我有一个用户表,有两个字段id已经是主键和自动增量但是我有另一个名为user_id的字段,它是独立的,我需要有自动增量但是第一个插入的行在db中的值为10000,并在此之后递增。
这是我到目前为止在数据库中创建用户的功能。如何以尽可能少的代码将第一行插入10000,然后再添加1。
/**
* Create new user record
*
* @param array
* @param bool
* @return array
*/
function create_user($data)
{
$data['created'] = date('Y-m-d H:i:s');
$this->db->set('username', $data['username']);
$this->db->set('password', $data['password']);
$this->db->set('password2', $data['password2']);
$this->db->set('email', $data['email']);
$this->db->set('first_name', $data['first_name']);
$this->db->set('last_name', $data['last_name']);
$query = $this->db->insert('users');
if ($query)
{
$user_id = $this->db->insert_id();
if ($activated) $this->create_profile($user_id);
return array('user_id' => $user_id);
}
return NULL;
}
答案 0 :(得分:2)
您可以使用INSERT INTO ... SELECT
语句。不知道如何在数据库库中应用它。但它的纯SQL。请参阅我的MySQL控制台日志。
mysql> CREATE TABLE `users`(
id INT AUTO_INCREMENT,
`name` VARCHAR(10),
`user_id` INT,
PRIMARY KEY(`name`),
UNIQUE KEY (`id`)
);
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO users VALUES (null, 'name1', 10000);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO users SELECT null, 'name2', MAX(`user_id`)+1 FROM `users`;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> INSERT INTO users SELECT null, 'name2', MAX(`user_id`)+1 FROM `users`;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM `users`;
+----+-------+---------+
| id | name | user_id |
+----+-------+---------+
| 1 | name1 | 10000 |
| 2 | name2 | 10001 |
| 3 | name3 | 10002 |
+----+-------+---------+
3 rows in set (0.00 sec)
答案 1 :(得分:1)
试试这个:
...
$this->db->set('username', $data['username']);
$this->db->set('user_id', 'MAX(user_id)+1');
$this->db->set('password', $data['password']);
...
并创建第一个user_id为10000的用户。这样,10000就是MAX。
答案 2 :(得分:1)
你可以随时创建自己的表来存储你想要自动增加的额外数字,就像mySQL所做的那样。唯一的区别是mySQL有一个内置函数来支持iNT列的每个表。但内置选项仅适用于一行和一行。
本质上通过创建表ID = tinyINT(4),user_id = INT(11)
来实现插入新行,ID = 1,user_id = 10000
在插入到其他表中之前,对此新表的查询获取user_id +1,然后更新它...然后使用该新数字插入另一个表。
我意识到这有额外2个查询的开销概念,但它满足了所需的目的。实际上,如果你以正确的方式构建一个JOIN查询,你可以在大多数情况下在单个查询中完成所有这些