插入到表中,跳过自动递增列而无需写入列的名称

Nag*_*hab 2 mysql sql

所以我有超过30列的这个大表,我想要做的是插入它的值,但跳过第一列是自动递增的'id',所以我有两个选择我能想到,一个是:

INSERT INTO 'table name' col2,col3,col4... VALUES val2,val3,val4
Run Code Online (Sandbox Code Playgroud)

但是,复制列的名称需要花费很长时间,并且可能会遗漏一封信,从而产生错误.所以另一种选择是获取表中的最后一个id并自己编辑下一个id:

$last_row_query = mysql_query("SELECT id FROM `order` ORDER BY id DESC LIMIT 1");
if(!$last_row_query) {
    die('invalid query: '.mysql_error());
}
$last_row = mysql_fetch_assoc($last_row_query);
$last_id = $last_row['id'];
$current_id = $last_id+1;
Run Code Online (Sandbox Code Playgroud)

然后查询将是

INSERT INTO 'table name' VALUES $current_id,val2,val3,val4
Run Code Online (Sandbox Code Playgroud)

这两种方式的效率有什么不同吗?有没有比另一种更推荐的方式?

Bil*_*win 5

如果您获取当前值并尝试插入下一个更高的值,则会创建竞争条件.两个并发的应用程序请求将尝试插入相同的值.

更好的解决方案是使用NULLDEFAULT代替值.零也可能有效,具体取决于SQL模式.

INSERT INTO `table name` VALUES (DEFAULT, ?, ?, ?);
Run Code Online (Sandbox Code Playgroud)

并且记得将表名放在后面,而不是单引号.单引号用于字符串文字或日期文字.