XÁC NHẬN với CHỌN


287

Tôi có một truy vấn chèn bằng cách chọn:

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

Có thể chỉ chọn "tên, vị trí" cho phần chèn và đặt gid thành một cái gì đó khác trong truy vấn không?

Câu trả lời:


547

Vâng, hoàn toàn, nhưng kiểm tra cú pháp của bạn.

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

Bạn có thể đặt một hằng số cùng loại như gidở vị trí của nó, không chỉ 1, tất nhiên. Và, tôi chỉ tạo nên cidgiá trị.


2
Đã làm việc, cảm ơn bạn rất nhiều. Với Chèn Chọn, dấu ngoặc đơn không bắt buộc xung quanh tên trường. Nhưng khi bạn bắt đầu chỉ định các giá trị trên đầu chọn, rõ ràng bạn cần () xung quanh tên trường.
Kyle

Lưu ý rằng bạn không thể sử dụng bí danh trong mệnh đề chèn: "INSERT INTO khóa học t1 (t1.name, t1.location, t1.gid) [...] sẽ thất bại.
raphael

@Andrew có phương pháp nào để trả về cùng lựa chọn này mà không chạy chọn lần sau không? nếu tôi muốn chèn và nhận kết quả của bảng khóa học
TAHA SULTAN TEMURI

1
@TAHASULTANTEMURI Câu hỏi khác nhau. Nhưng nếu tôi hiểu những gì bạn đang hỏi, SQL Server (không phải những gì được hỏi, nhưng những gì tôi sử dụng những ngày này) có OUTPUTmệnh đề , cho phép bạn đặt bất cứ thứ gì bạn chèn vào bảng khác. Tôi không nghĩ MySQL có tương đương. Bạn có thể tạo một bảng tạm thời , chọn vào bảng đó, sau đó điền coursesvào bảng đó, sau đó sử dụng bảng tạm thời cho bất cứ điều gì khác bạn cần.
Andrew

31

Vâng, đúng vậy. Bạn có thể viết :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

hoặc bạn có thể nhận các giá trị từ một tham gia khác của chọn ...


XÁC NHẬN VÀO tên khóa học, địa điểm, tên gid CHỌN, địa điểm, '$ this-> gid' TỪ các khóa học WHERE cid = $ cid - Tôi gặp lỗi: Bạn gặp lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần 'tên, vị trí, gid tên CHỌN, vị trí,' 22 'TỪ các khóa học WHERE cid = 23' tại dòng 1
Kyle

Tôi đoán trường gid của bạn là một số nguyên vì vậy: '22' phải là 22. Thay đổi '$ this-> gid' bằng $ this-> gid
Alex Reche Martinez

22 và '22' không quan trọng đối với sql, nhưng tôi đặt một chuỗi trong trường hợp trường tương tự như một định danh duy nhất.
Dumitrescu Bogdan

8

Cú pháp đúng: chọn sai chính tả

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 

5

Chắc chắn, những gì bạn muốn sử dụng cho gid? một giá trị tĩnh, var var, ...

Giá trị tĩnh của 1234 có thể như sau:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid


1

Tất nhiên bạn có thể.

Tuy nhiên, một điều cần lưu ý: Câu INSERT INTO SELECTlệnh sao chép dữ liệu từ một bảng và chèn nó vào một bảng khác VÀ yêu cầu các loại dữ liệu trong bảng nguồn và bảng đích khớp nhau. Nếu các kiểu dữ liệu từ các cột trong bảng đã cho không khớp (nghĩa là cố gắng chèn VARCHARvào INThoặc TINYINTvào INT) thì máy chủ MySQL sẽ ném SQL Error (1366).

Vì vậy, hãy cẩn thận.

Đây là cú pháp của lệnh:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

Lưu ý bên lề: Có một cách để tránh sự cố chèn các loại cột khác nhau bằng cách sử dụng chức năng truyền trong SELECTví dụ:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Chuyển đổi này ( CAST()là từ đồng nghĩa của CONVERT()) rất hữu ích nếu các bảng của bạn có các bộ ký tự khác nhau trên cùng một cột của bảng (điều này có khả năng dẫn đến mất dữ liệu nếu không được xử lý đúng cách).


-2

Cú pháp đúng cho truy vấn của bạn là:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.