2015-04-22 5 views
2

У меня есть таблица, которая соответствует заказам клиентов. Я использую AUTO_INCREMENT для определения идентификатора заказа. У меня есть этот SQL-код в orders таблицы:Как я могу получить добавочное значение auto

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 указать, какой порядок, что продукция принадлежит. SQL код purchased_products таблицы:

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 таблицу продуктов с Order 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']}')"; 

Это дает мне головную боль. Я не знаю, как это сделать. Это должно быть сделано по-другому? Как связать идентификатор заказа с принадлежащими ему продуктами?

+1

Есть способы определить «только что назначенные» автоиды, но в значительной степени каждая СУРБД имеет свои собственные методы. Таким образом, стандартный вопрос: какие СУБД вы используете? –

+0

Просто предложение .. используйте 'MAX()' метод ..Это будет выяснить последний вставленный 'id'. Но обратите внимание, что это поможет только в том случае, если в таблице заказов не было сделано никакой другой' insert'. Это всего лишь способ –

+0

RDBMS знает, что было последним вставленным автоматическим приращением id в конкретную таблицу. Ты можешь его достать. Насколько я помню, в mysql он называется LAST_INSERT_ID. Однако, как сказал @Philip Kelley, это зависит от используемой СУБД. – SayusiAndo

ответ

0

Я сделал это с помощью PDO lastInsertId(), чтобы получить идентификатор последнего вставленного заказа:

$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']}')"; 

Спасибо всем, кто пытался помочь! Они поставили меня правильно!

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 так, что если какие-либо ошибки вы можете откат.

+0

Но мне нужно получить последнее значение первичного ключа из таблицы 'orders', а затем добавить его в' oder_id' в таблице 'purchase_products'. – Dyan

0

вы можете использовать SCOPE_IDENTITY(), чтобы получить последний идентификатор, который вы вставили в текущем сеансе sql.

вот еще один вопрос с большим описанием всех отличий:

identity scope Question

0

Как и другие отметили, что зависит от РСУБД. В Oracle вы обычно используете sequences. Вы создаете и сохраняете последовательность в базе данных и можете использовать ее на INSERT, выполнив sequencename.nextval().

Последовательности позволяют вам управлять стартовыми значениями, приростом/уменьшением размера, кешированием и многое другое.

1

использование функция last_insert_id(). он даст вам значение, которое было автоматически добавлено как последнее до его вызова.

Смежные вопросы