MySQL - เปลี่ยนตารางเพื่อใส่ UUID โดยอัตโนมัติ


14

ตกลงฉันรู้ว่าฉันเคยทำมาก่อน แต่ฉันไม่สามารถคิดออกมาได้ ฉันสร้างตาราง หนึ่งในคอลัมน์นั้นมีป้ายกำกับ "LogID" ซึ่งเป็นคีย์หลักด้วย

ฉันจะแก้ไขเพื่อให้คอลัมน์นี้สร้าง UUID สำหรับแต่ละรายการใหม่ได้อย่างไร

ขอบคุณ

คำตอบ:


17

เพียงแค่สร้างทริกเกอร์ให้ทำงานก่อนที่จะแทรกเพื่อสร้าง UUID สำหรับคอลัมน์ที่กำหนด

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();

3

UUID ()แสดงออกสร้าง UUID เมื่อเรียกว่า

น่าเสียดายที่ (AFAIK อยู่ดี) MySQL จะไม่อนุญาตให้ใช้นิพจน์เป็นค่าเริ่มต้นสำหรับเขตข้อมูล ในการหลีกเลี่ยงคุณสามารถตั้งค่าเขตข้อมูลเป็นค่าเริ่มต้นว่างและมีทริกเกอร์ที่ปรับปรุงเขตข้อมูลด้วยการแทรก UUID


2

ฉันค่อนข้างมั่นใจว่าคุณยังทำไม่ได้จริง ๆ ฉันอย่างจริงจังจะพิจารณาไม่ใช้ UUID เป็นคีย์หลักแทนที่จะใช้ slimmer, INTชนิดของข้อมูลที่ดีกว่าเช่น คุณสามารถเพิ่ม UUID ของคุณเป็นคอลัมน์แยกต่างหากและอัปเดตผ่าน a TRIGGERหากเหมาะสมกับคุณ


จำนวนเต็มแยกหากคุณต้องการให้ระเบียนไม่ซ้ำกันในฐานข้อมูลของคุณ
Cfreak

1
ฉันสงสัยว่ามีการออกแบบรุ่นที่ใหญ่กว่าหรือเลือกเครื่องมือหากความต้องการกำหนดรูปแบบการจัดเก็บเครื่องยนต์ในระดับนั้น การมี UUID เป็นคอลัมน์แยกเป็นทางออกที่ดีที่สุดของทั้งสองโลกในกรณีนี้
Avarkx

UUID รับการจัดรูปแบบพองเมื่อมนุษย์ หากคุณต้องการใช้ UUID เป็นคีย์หลักให้ตัดเครื่องหมายขีดกลางออกแล้วปลดมันออก หากคุณต้องการเวอร์ชันที่จัดรูปแบบโดยมนุษย์คุณสามารถเพิ่มคอลัมน์ที่สร้างลงในตารางได้ SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 ไบต์ไบนารี่ ยังคงใหญ่กว่าINTแต่ก็ดีกว่าVARCHAR(36)
miknik

คำแนะนำที่ไม่ดี, miknik ฐานข้อมูลของคุณจะขยายอย่างมากหากคุณใช้ UUID เป็นคีย์หลัก อาจมีคอลัมน์จำนวนเต็ม 16 คอลัมน์แยกเป็นคีย์หลักแบบผสม และดัชนีการกระจายตัวของจำนวนมาก! คีย์หลักของคุณตอนนี้สุ่ม ถ้าคุณทำอย่าใช้กุญแจต่างประเทศ ร่วมเปลี่ยนจาก O (n) เป็น O (n ^ 2) สองตัวเชื่อมจาก O (n log10 (n)) ถึง O (n ^ 3) แทนที่ด้วย 100,000 และลบส่วนต่าง
TamusJRoyce

2

ฉันเพิ่งตัดสินใจรวมคำสั่ง UUID () ไว้ในส่วนแทรกจากแอปพลิเคชันของฉัน

ขอบคุณทุกคน

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