SQL DELETE với INNER JOIN


120

Có 2 bảng spawnlistnpcvà tôi cần xóa dữ liệu khỏi spawnlsit. npc_templateid = n.idTemplatelà thứ duy nhất "kết nối" các bảng. Tôi đã thử tập lệnh này nhưng nó không hoạt động.

Tôi đã thử điều này:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

1
Càng ngạc nhiên hơn vì thông thường cộng đồng L2 giữ cho riêng mình. Hơi kỳ lạ mặc dù đọc câu hỏi và nghĩ "có vẻ như ... hmm ... đúng là như vậy!" :)
Corbin

1
@Corbin Tôi hoàn toàn hiểu ý bạn. Thật thú vị, tôi đang nhận được trợ giúp về câu hỏi L2 cho một dự án công việc.
Marco Aurélio Deleu

Xóa khỏi table1 khỏi table1 t1 tham gia bên trong table2 t2 trên t1.id = t2.id; chi tiết youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Câu trả lời:


224

Thêm .*vào strong dòng đầu tiên của bạn.

Thử:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

Đây là lỗi tôi mắc phải: [Err] 1064 - Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' tại dòng 1 [Err] DELETE l2revo.root. spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] Đã hoàn thành - Không thành công -------------------------------------------- ------
Tham gia

Trong lỗi của bạn, có vẻ như bạn đang sử dụng hai tên máy chủ khác nhau cho spawnlist. Tôi thấy l2revo.root.spawnlistdb.root.spawnlist.
ThinkingStiff

Tôi chỉ mắc lỗi khi dán nó ở đây, nhưng tên người dùng và tên db giống nhau, do lỗi của tôi.
Tham gia

Thử thêm ASbí danh của bạn.
ThinkingStiff

4
. @GauravRamanan s * nói với mysql gì để DELETE, bạn không muốn xóa các hàng từ bảng tham gia
Julz

12

Nếu cơ sở dữ liệu là InnoDB thì tốt hơn là bạn nên sử dụng khóa ngoại và phân tầng khi xóa, điều này sẽ làm những gì bạn muốn và cũng không có dữ liệu thừa được lưu trữ.

Tuy nhiên, đối với ví dụ này, tôi không nghĩ bạn cần những chữ cái đầu tiên:

DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster";

Có thể là ý tưởng tốt hơn nếu chọn các hàng trước khi xóa để bạn chắc chắn rằng mình đang xóa những gì bạn muốn:

SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";

Bạn cũng có thể kiểm tra cú pháp xóa MySQL tại đây: http://dev.mysql.com/doc/refman/5.0/en/delete.html


Đây là lỗi tôi nhận được: [Err] 1064 - Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "Monste 'tại dòng 1 [Err] XÓA khỏi spawnlist s INNER THAM GIA npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Đã xong - Không thành công ------------------------ --------------------------
Tham giaOG

Đã thay đổi, có thể thành công hơn bây giờ?
Dan

Lỗi: [Err] 1066 - Không phải bảng / bí danh duy nhất: 'npc' [Err] XÓA danh sách tạo ra khỏi danh sách sinh sản, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Msg] Đã hoàn thành - Không thành công -------------------------------------------- ------
Tham gia

Nếu bạn chỉ chạy nó một lần, bạn có thể chạy nó kém hiệu quả khủng khiếp: DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin

Đó là nỗ lực cuối cùng của tôi, nếu bạn chỉ xóa khỏi một bảng trên một tham gia thì tôi không thể hiểu tại sao điều đó không hoạt động.
Dan

6

nếu cơ sở dữ liệu là InnoDB, bạn không cần phải tham gia xóa. chỉ có

DELETE FROM spawnlist WHERE spawnlist.type = "monster";

có thể được sử dụng để xóa tất cả các bản ghi được liên kết với khóa ngoại trong các bảng khác, để làm điều đó trước tiên bạn phải liên kết các bảng của mình trong thời gian thiết kế.

CREATE TABLE IF NOT EXIST spawnlist (
  npc_templateid VARCHAR(20) NOT NULL PRIMARY KEY

)ENGINE=InnoDB;

CREATE TABLE IF NOT EXIST npc (
  idTemplate VARCHAR(20) NOT NULL,

  FOREIGN KEY (idTemplate) REFERENCES spawnlist(npc_templateid) ON DELETE CASCADE

)ENGINE=InnoDB;

nếu bạn sử dụng MyISAM, bạn có thể xóa các bản ghi tham gia như thế này

DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';

ở dòng đầu tiên tôi đã khởi tạo hai bảng tạm thời để xóa bản ghi, ở dòng thứ hai tôi đã gán bảng tồn tại cho cả a và b nhưng ở đây tôi đã liên kết cả hai bảng với nhau bằng từ khóa join và tôi đã khớp khóa chính và khóa ngoại cho cả hai bảng tạo liên kết, ở dòng cuối cùng, tôi đã lọc bản ghi theo trường để xóa.


typethực sự nằm trong bảng khác, không phải trong spawnlistbảng, vì vậy cần tham gia
vitro
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.