เป็นไปได้ไหมที่จะลบล้างประโยค where?
เช่น
DELETE * FROM table WHERE id != 2;
เป็นไปได้ไหมที่จะลบล้างประโยค where?
เช่น
DELETE * FROM table WHERE id != 2;
คำตอบ:
คุณสามารถทำเช่นนี้
DELETE FROM table WHERE id NOT IN ( 2 )
หรือ
DELETE FROM table WHERE id <> 2
ดังที่ @Frank Schmitt กล่าวไว้คุณอาจต้องการระมัดระวังเกี่ยวกับค่า NULL ด้วย หากคุณต้องการลบทุกอย่างที่ไม่ใช่2
(รวมถึง NULL) OR id IS NULL
ให้เพิ่มคำสั่ง WHERE
!= NULL
ไม่ทำงาน: "คุณไม่สามารถใช้ตัวดำเนินการเปรียบเทียบทางคณิตศาสตร์เช่น =, <, หรือ <> เพื่อทดสอบค่า NULL" ( จากเอกสาร MySQL ) ดังนั้นหมายความว่าคุณต้องใช้ IS NOT NULL
คำถามของคุณได้รับคำตอบจากผู้โพสต์คนอื่น ๆ แล้วฉันแค่อยากจะชี้ให้เห็นว่า
delete from table where id <> 2
(หรือตัวแปรดังกล่าวไม่ใช่ id = 2 ฯลฯ ) จะไม่ลบแถวที่ id เป็นโมฆะ
หากคุณต้องการลบแถวด้วย id = NULL:
delete from table where id <> 2 or id is NULL
delete from table where id <> 2
แก้ไข: เพื่อแก้ไขไวยากรณ์สำหรับ MySQL
คุณสามารถทำสิ่งต่อไปนี้:
DELETE * FROM table WHERE NOT(id = 2);
ใช้<>
เพื่อลบล้างคำสั่ง where
มองย้อนกลับไปที่ตรรกะที่เป็นทางการและพีชคณิต นิพจน์เช่น
A & B & (D | E)
อาจถูกลบล้างได้สองวิธี:
วิธีที่ชัดเจน:
!( A & B & ( D | E ) )
ข้างต้นสามารถปรับปรุงใหม่ได้คุณต้องจำคุณสมบัติบางอย่างของนิพจน์เชิงตรรกะ:
!( A & B )
เทียบเท่ากับ(!A | !B)
.!( A | B )
เทียบเท่ากับ(!A & !B)
.!( !A )
เทียบเท่ากับ (A)แจกแจง NOT (!) ให้ทั่วทั้งนิพจน์ที่ใช้สลับตัวดำเนินการและกำจัดเชิงลบคู่ในขณะที่คุณดำเนินการ:
!A | !B | ( !D & !E )
ดังนั้นโดยทั่วไปข้อใด ๆ ที่อาจถูกลบล้างตามกฎข้างต้น การปฏิเสธนี้
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
คือ
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
หรือ
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
แบบไหนดีกว่ากัน? นั่นเป็นคำถามที่คำนึงถึงบริบทมาก คุณเท่านั้นที่จะตัดสินใจได้
อย่างไรก็ตามโปรดทราบว่าการใช้ NOT อาจส่งผลต่อสิ่งที่เครื่องมือเพิ่มประสิทธิภาพสามารถทำได้หรือไม่สามารถทำได้ คุณอาจได้รับแผนการสืบค้นน้อยกว่าที่เหมาะสม
WHERE id <> 2
ควรจะทำงานได้ดี ... นั่นคือสิ่งที่คุณหลังจากนั้นหรือไม่?
ใช่. ถ้าหน่วยความจำให้บริการฉันก็น่าจะใช้ได้ คุณสามารถใช้:
DELETE FROM table WHERE id <> 2
ทางออกที่ดีที่สุดคือการใช้
DELETE FROM table WHERE id NOT IN ( 2 )
ฉันแค่แก้ปัญหานี้ หากคุณใช้ <> หรือไม่ได้อยู่ในตัวแปรนั่นคือโมฆะจะทำให้เกิดเป็นเท็จ ดังนั้นแทนที่จะเป็น <> 1 คุณต้องตรวจสอบดังนี้:
AND (isdelete is NULL or isdelete = 0)
id != NULL
ไม่ได้ผลตามที่คุณคาดหวัง