เพิ่มเขตข้อมูลฐานข้อมูล 1


158

ด้วย MySQL ถ้าฉันมีเขตข้อมูลของการพูดว่าเข้าสู่ระบบฉันจะไปเกี่ยวกับการปรับปรุงสนามโดย 1 ในคำสั่ง sql?

ฉันกำลังพยายามสร้างแบบสอบถาม INSERT ที่สร้างชื่อนามสกุลและเข้าสู่ระบบ อย่างไรก็ตามหากการรวมกันของชื่อและนามสกุลมีอยู่แล้วให้เพิ่มการเข้าสู่ระบบด้วย 1

ดังนั้นตารางอาจมีลักษณะเช่นนี้ ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

ฉันตามคำสั่งว่าเมื่อทำงานจะแทรกคนใหม่ (เช่น Tom Rogers) หรือเพิ่มการเข้าสู่ระบบหาก John Jones เป็นชื่อที่ใช้ ..

คำตอบ:


287

การอัพเดตรายการ:

การเพิ่มขึ้นอย่างง่ายควรทำเคล็ดลับ

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

แทรกแถวใหม่หรืออัปเดตหากมีอยู่แล้ว:

หากคุณต้องการอัปเดตแถวที่มีอยู่ก่อนหน้านี้หรือแทรกหากยังไม่มีอยู่คุณสามารถใช้REPLACEไวยากรณ์หรือINSERT...ON DUPLICATE KEY UPDATEตัวเลือก (ตามที่Rob Van Damแสดงในคำตอบของเขา )

การแทรกรายการใหม่:

หรือบางทีคุณกำลังมองหาสิ่งที่ชอบINSERT...MAX(logins)+1? โดยพื้นฐานแล้วคุณจะต้องเรียกใช้คิวรีดังต่อไปนี้ - อาจซับซ้อนกว่านี้เล็กน้อยขึ้นอยู่กับความต้องการเฉพาะของคุณ:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
และให้แน่ใจว่าได้เพิ่ม WHERE clause ของคุณตามความเหมาะสมกับแอปพลิเคชันของคุณ
BoltClock

จริงๆเหรอ!! ฉันไม่รู้ว่าคุณสามารถทำได้ !!! ดังนั้นจะใช้งานได้หรือไม่ ใส่ IGNORE mytable (ชื่อ, นามสกุล, ชื่อเข้าสู่ระบบ) ค่า (จอห์น, สมิ ธ , เข้าสู่ระบบ = เข้าสู่ระบบ + 1)
แมตต์

@ Matt ไม่มีที่เป็นไม่ใช่INSERT UPDATEหากคุณต้องการแทรกคุณจะต้องได้รับสูงสุดและเพิ่ม 1 ลงไป
Sampson

2
@ Matt คำถามของคุณถาม "เกี่ยวกับการอัปเดตด้วย 1" ซึ่งทำให้เกิดความสับสน ฉันคิดว่าคุณอาจกำลังมองหาวิธีแก้ไขปัญหาอื่นซึ่งฉันได้อ้างอิงในคำตอบที่ปรับปรุงแล้วของฉัน
Sampson

1
@ Jonathan ขออภัยในความสับสน .. ฉันได้ปรับปรุงคำถามของฉันหวังว่า thats บิตชัดเจน ..
แมตต์

70

หากคุณสามารถสร้างอย่างปลอดภัย (ชื่อ, นามสกุล) คีย์หลักหรืออย่างน้อยใส่รหัส UNIQUE บนพวกเขาคุณสามารถทำได้:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

หากคุณไม่สามารถทำเช่นนั้นได้คุณจะต้องดึงสิ่งที่คีย์หลักนั้นเป็นอันดับแรกดังนั้นฉันไม่คิดว่าคุณจะสามารถบรรลุสิ่งที่คุณต้องการในการสืบค้นเดียว


1
คีย์หลัก 64+ ไบต์ไม่ใช่คำแนะนำที่ยอดเยี่ยม
Jon Black

จะใช้งานตัวแปรแทน '1' หรือไม่ ie ON DUPLICATE การเข้าสู่ระบบ KEY UPDATE = การเข้าสู่ระบบ + numLogins; (รูปแบบถูกต้องแน่นอน)
แมตต์

1
ระวังว่าON DUPLICATE KEY UPDATEการจำลองแบบไม่ปลอดภัยอย่างสมบูรณ์!
oucil

2

คุณไม่ได้พูดในสิ่งที่คุณพยายามจะทำ แต่คุณบอกใบ้ให้ดีพอในการแสดงความคิดเห็นต่อคำตอบอื่น ๆ ฉันคิดว่าคุณอาจกำลังมองหาคอลัมน์เพิ่มอัตโนมัติ

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

จากนั้นไม่จำเป็นต้องใช้รหัสพิเศษในการแทรก แค่

insert into logins (username, password) values ('user','pass');

MySQL API มีฟังก์ชั่นที่จะบอกคุณว่าหมายเลขผู้ใช้ใดที่ถูกสร้างขึ้นเมื่อคุณรันคำสั่งนี้ในรหัสลูกค้า


2

ฉันไม่เชี่ยวชาญใน MySQL แต่คุณควรดูทริกเกอร์เช่นก่อนใส่ ในทริกเกอร์คุณสามารถเรียกใช้คิวรีแบบเลือกในตารางต้นฉบับของคุณและหากพบสิ่งที่เพิ่งอัพเดตแถว 'ล็อกอิน' แทนการแทรกค่าใหม่ แต่ทั้งหมดนี้ขึ้นอยู่กับรุ่นของ MySQL ที่คุณใช้


2

นี้มีมากขึ้นเชิงอรรถไปยังหมายเลขของคำตอบข้างต้นซึ่งขอแนะนำให้ใช้ที่ON DUPLICATE KEY UPDATE, ระวังว่านี่คือไม่ปลอดภัยเสมอจำลองแบบดังนั้นหากคุณเคยวางแผนในการเจริญเติบโตเกินเซิร์ฟเวอร์เดียวที่คุณจะต้องการหลีกเลี่ยงปัญหานี้และใช้แบบสอบถามที่สอง ซึ่งเป็นหนึ่งในการตรวจสอบการดำรงอยู่และจากนั้นสองเพื่อทั้ง UPDATEเมื่อแถวที่มีอยู่หรือINSERTเมื่อมันไม่ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.