如何获得自动递增的值

时间:2015-04-22 17:50:33

标签: sql pdo

我这里有一张与客户订单相对应的表格。我使用AUTO_INCREMENT来确定订单的ID。我有这个SQL代码到orders表:

CREATE TABLE IF NOT EXISTS `orders` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `customer_id` int(11) NOT NULL,
  `customer_name` varchar(500) NOT NULL,
  `order_total_price` decimal(20, 2) NOT NULL,
  `order_date` varchar(100) NOT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB

我需要的是将该订单的每个产品插入另一个带有外键order_id的表中,以指定产品所属的订单。 purchased_products表的SQL代码是:

CREATE TABLE IF NOT EXISTS `purchased_products` (
  `order_id` int (11) NOT NULL,
  FOREIGN KEY (`order_id`) REFERENCES orders(`order_id`),
  `product_name` varchar(500) NOT NULL,
  `product_price` decimal(20, 2) NOT NULL,
  `product_quantity` int(11) NOT NULL,
  PRIMARY KEY (`order_id`)
) 

当用户购买东西时,我使用它来在orders表中插入数据:

INSERT INTO orders (customer_id, customer_name, order_total_price, order_date)
VALUES ('{$customer_id}', '{$customer['customer_name']}', '{$order_total_price}', '{$order_date}')";

这是我的问题。我需要在purchased_products表中插入生成订单ID的产品:

INSERT INTO purchased_products (order_id, product_name, product_price, product_quantity)
VALUES ('*/The ID of the order need to goes here*/', '{$product['product_name']}', '{$product['product_price']}', '{$product['quantity']}')";

这令我头疼。我真的不知道该怎么做。这应该以不同的方式完成?如何将订单ID与属于它的产品相关联?

5 个答案:

答案 0 :(得分:1)

使用函数last_insert_id()。它将为您提供在调用之前自动递增为最后一个值的值。

答案 1 :(得分:0)

您可以使用@@IDENTITY

获取最后插入的主键值

以下是MSDN文章:https://msdn.microsoft.com/en-us/library/ms187342.aspx

USE AdventureWorks2012;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO

SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO

我还建议将语句包装在TRANSACTION中,以便在发生任何错误时可以回滚。

答案 2 :(得分:0)

您可以使用SCOPE_IDENTITY()来检索您在当前sql会话中插入的最后一个标识。

这是另一个问题,对所有差异进行了很好的描述:

identity scope Question

答案 3 :(得分:0)

正如其他人评论的那样,它取决于RDBMS。在Oracle中,您通常使用sequences。您可以在数据库上创建和存储序列,并可以INSERTsequencename.nextval()上使用它。

使用序列可以控制起始值,递增/递减大小,缓存等等。

答案 4 :(得分:0)

我是通过使用PDO lastInsertId()获取最后插入的订单的ID来完成的:

$sql = "INSERT INTO orders (customer_id, customer_name, order_total_price, order_date)
        VALUES ('{$customer_id}', '{$customer['customer_name']}', '{$order_total_price}', '{$order_date}')";

$query = $connection->prepare($sql);    
$query->execute();

$respective_order_id = $connection->lastInsertId();

然后:

INSERT INTO purchased_products (order_id, product_name, product_price, product_quantity)
VALUES ('{$respective_order_id}', '{$product['product_name']}', '{$product['product_price']}', '{$product['quantity']}')";

感谢所有试图帮助的人!他们让我以正确的方式!