我正在尝试检索一个表A的id以插入另一个表B.我不能使用last_insert_id(),因为我没有在A中插入任何内容.有关如何做到这一点的任何想法?
$n = mysql_query("SELECT max(id) FROM tablename"); 似乎不起作用,也不起作用
$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id");
Run Code Online (Sandbox Code Playgroud) 当我在MySQL控制台中执行以下操作时,它可以正常工作:
INSERT INTO videos (embed_code) VALUES ('test code here');
SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)
但是,当我通过PHP执行上述查询时,结果为空.
在数据抽象下,我使用的是名为的数据库访问类DB.这就是我通过PHP尝试上述查询的方法:
$embedCode = htmlentities($_POST['embed_code']);
//Insert video in database **WORKS**
DB::query("INSERT INTO videos (embed_code) VALUES ('$embedCode');");
//Retrieve id **DOES NOT WORK**
$row = DB::getSingleRow("SELECT LAST_INSERT_ID();");
$videoId = $row[0];
Run Code Online (Sandbox Code Playgroud)
我不能通过embed_code选择新的id,因为embed_code可以重复.
谢谢!
我总是听说使用"lastInsertId"(或者如果你不使用PDO,则使用mysql_insert_id())是邪恶的.在触发器的情况下,它显然是,因为它可以返回一些完全不是INSERT创建的最后一个ID.
$DB->exec("INSERT INTO example (column1) VALUES ('test')");
// Usually returns your newly created ID.
// However when a TRIGGER inserts into another table with auto-increment:
// -> Returns newly created ID of trigger's INSERT
$id = $DB->lastInsertId();
Run Code Online (Sandbox Code Playgroud)
有什么选择?
我的INSERT声明如下:
INSERT INTO officer (officer_number,
name,
bank_id)
VALUES ('',
'',
8)
ON DUPLICATE KEY UPDATE officer_number = '',
name = '',
bank_id = 8,
id = LAST_INSERT_ID(id)
Run Code Online (Sandbox Code Playgroud)
这样做的方式一直很好.当我添加以下触发器时它停止工作:
CREATE TRIGGER officer_update BEFORE UPDATE ON `officer`
FOR EACH ROW SET NEW.updated_at = NOW(), NEW.created_at = OLD.created_at
Run Code Online (Sandbox Code Playgroud)
并不是officer记录没有被插入.似乎触发器是劫持LAST_INSERT_ID()或其他东西.我这样说是因为下一个执行的查询是这样的:
INSERT INTO account (import_id,
branch_id,
account_number,
officer_id,
customer_id,
open_date,
maturity_date,
interest_rate,
balance,
opening_balance)
VALUES ('123',
'4567',
'789',
'0', # This is the officer id which is of course …Run Code Online (Sandbox Code Playgroud) 好.所以缺点是,我试图做一个INSERT SELECT,例如:
START TRANSACTION;
INSERT INTO dbNEW.entity (commonName, surname)
SELECT namefirst, namelast
FROM dbOLD.user;
SET @key = LAST_INSERT_ID();
INSERT INTO dbNEW.user (userID, entityID, other)
SELECT user_id, @key, other
FROM dbOLD.user;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
当然@key不会从每个插入返回每个后续的LAST_INSERT_ID(),而只返回最后一个插入的ID.
基本上,我将旧的USER表拆分为ENTITY和USER,如:
dbOLD.user
+-------------+---------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+------------+----------------+
| user_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| namefirst | varchar(20) | NO | | | |
| namelast | varchar(20) | NO | …Run Code Online (Sandbox Code Playgroud) 有这张桌子.
| id | domain |
Run Code Online (Sandbox Code Playgroud)
id是主键.domain是一个独特的钥匙.
我想要:
id域名.现在我这样做:
INSERT INTO domains
SET domain = 'exemple.com'
ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id)
Run Code Online (Sandbox Code Playgroud)
然后PDO::lastInsertId()得到id.
但关键是这个速度尽可能快,所以我会问:我可以用更好的方式做到这一点吗?
我正在尝试使用PDO的lastInsertId方法,但文档声明对于某些rdbms我需要一个序列名作为参数.只熟悉mysql,我不太确定序列名是什么.它们是指包含自动增量ID的列的名称吗?以下是该方法的文档:
http://php.net/manual/en/pdo.lastinsertid.php
任何有关这方面的信息将不胜感激.谢谢.
引用自这里:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)
上面的用例是什么(有什么好处)?
我以前从未将 LAST_INSERT_ID 与任何参数一起使用过......
更新
我的问题是,为什么人们想要以这种方式模拟这种序列,当它可以通过自动递增主键自动开箱即用时?
我有 2 个 MySQL 表
表#1 - 容器:
container_id INT (PK AI)
start_time DATETIME
Run Code Online (Sandbox Code Playgroud)
表#2 - 预订
reservation_id INT (PK AI)
reservation_time DATETIME
container_id INT (FK)
Run Code Online (Sandbox Code Playgroud)
PHP代码:
mysqli_query($dbc,'SET AUTOCOMMIT=0');
mysqli_query($dbc,'START TRANSACTION');
$q1 = "INSERT INTO container (start_time) VALUES
('2012-07-03 11:00:00')";
$q2 = "INSERT INTO reservation (reservation_time, container_id) VALUES
('2012-07-03 11:00:00', LAST_INSERT_ID())";
$r1 = mysqli_query($dbc, $q1);
$r2 = mysqli_query($dbc, $q2);
if ($r1 && r2){
mysqli_query($dbc, 'COMMIT');
} else {
mysqli_query($dbc, 'ROLLBACK');
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?$r2 返回假。LAST_INSERT_ID() 不起作用
我正在创建一个应用程序,我在表中插入数据.在表中插入数据后,我想得到该行的id,以便我可以根据它进行进一步的操作.我试图使用sqlite的last_insert_rowid()函数,但没有找到运气.任何人都可以告诉哪个是最后一个插入行id的最佳方法.任何想法都表示赞赏.提前致谢.
lastinsertid ×10
mysql ×8
php ×4
pdo ×2
cordova ×1
optimization ×1
performance ×1
sql ×1
transactions ×1
triggers ×1