2011-09-21 37 views
35

Tôi chèn một số từ vào một bảng hai cột với lệnh này:Làm cách nào để nhận ID của nhiều hàng được chèn vào trong MySQL?

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3'); 
  1. Làm thế nào tôi có thể nhận được ID (Primary Key) của hàng trong đó mỗi chữ được chèn vào. Ý tôi là trả về một giá trị như "55,56,57" sau khi thực hiện INSERT. MySQL có phản ứng như vậy không?

  2. Cột hạn là UNIQUE. Nếu một thuật ngữ đã tồn tại, MySQL sẽ không chèn nó. Có thể trả lại tham chiếu cho bản sao này (tức là ID của hàng có cụm từ tồn tại) không? Câu trả lời như "55, , 56".

Trả lời

35
  1. Bạn nhận được nó qua SELECT LAST_INSERT_ID(); hoặc qua có khuôn khổ của bạn/thư viện MySQL (trong bất cứ ngôn ngữ) gọi mysql_insert_id().

  2. Điều đó sẽ không hoạt động. Ở đó bạn phải truy vấn các ID sau khi chèn.

+5

1. Điều đó sẽ không hoạt động đối với chèn nhiều hàng như các chương trình OP. – ceejayoz

+0

+1 để có câu trả lời đúng. : D – brenjt

+2

Phải - không phải trong một với 'INSERT IGNORE'. Nhưng trong một bản đồ không phải là 'NGOORE', nó cung cấp cho bạn giá trị đầu tiên được tạo và chèn vào. – glglgl

3

Tại sao không chỉ:

SELECT ID 
    FROM terms 
WHERE term IN ('word1', 'word2', 'word3') 
+0

Điều kiện tìm nạp đó đã được chèn trước đó và nó sẽ dễ bị tổn thương đối với điều kiện chủng tộc trong đó một số thứ khác chèn bản ghi trước khi truy vấn chọn kích hoạt. – ceejayoz

+2

?? thuật ngữ có một điều kiện UNIQUE. Điều duy nhất có thể ảnh hưởng đến SELECT trong điều kiện chủng tộc là DELETE, không phải INSERT khác. Và theo (2) trong bài viết của OP, họ muốn các ID hồ sơ được chèn trước đó được đưa vào. – mellamokb

+0

Đó là những gì tôi đã có trong tâm trí; nhưng nó cần vài dòng mã hóa. Ngoài SELECT, tôi cần lấy kết quả và nhận chúng trong một vòng lặp while (trong php mà tôi sử dụng). Tôi hy vọng sẽ tìm thấy một số loại phản ứng mysql. – Googlebot

1

Trước tiên, để có được id chỉ chèn, bạn có thể làm một cái gì đó như:

SELECT LAST_INSERT_ID() ; 

Chăm sóc, điều này sẽ chỉ làm việc sau khi INSERT truy vấn cuối cùng của bạn và nó sẽ trả lại ID đầu tiên chỉ nếu bạn có nhiều lần chèn!

Sau đó, với tùy chọn IGNORE, tôi không nghĩ rằng có thể nhận được các dòng không được chèn vào. Khi bạn thực hiện INSERT IGNORE, bạn chỉ cần yêu cầu MySQL bỏ qua các dòng sẽ phải tạo một mục trùng lặp.

Nếu bạn không đặt tùy chọn này, INSERT sẽ bị ngừng và bạn sẽ có dòng liên quan đến trùng lặp.

+0

Ngay cả khi không có IGNORE, nó sẽ chỉ hoạt động đối với INSERT một hàng. Lệnh của tôi là một INSERT nhiều hàng – Googlebot

+0

Chỉ phần đầu tiên của câu trả lời của tôi là bao gồm IGNORE. –

+1

Nếu bạn đang sử dụng PHP, bạn có thể lưu trữ các ID trong một bảng bằng cách sử dụng một vòng lặp với một INSERT duy nhất trong mỗi đoạn văn. –

Các vấn đề liên quan