คำถามติดแท็ก auto-increment

การสร้างลำดับตัวเลขสำหรับการสร้างคีย์อัตโนมัติ

2
ฟังก์ชัน LAST_INSERT_ID () ของ MySql รับประกันว่าถูกต้องหรือไม่
เมื่อฉันทำแถวเดียวINSERTไปยังตารางที่มีAUTO_INCREMENTคอลัมน์ฉันต้องการใช้LAST_INSERT_ID()ฟังก์ชันเพื่อส่งกลับAUTO_INCREMENTค่า ed ' ใหม่ที่เก็บไว้สำหรับแถวนั้น Microsoft SQL Server และผู้ดูแลระบบหลายคนนั้นไม่ต้องสงสัยเลยว่าทราบถึงหน้าที่การใช้งานที่เทียบเท่าใน SQL Server ( SCOPE_IDENTITYและ@@IDENTITY) ที่ไม่เคยมีปัญหามาก่อน ฉันรู้สถานะของเอกสาร MySQL: ID ที่ถูกสร้างขึ้นจะถูกเก็บไว้ในเซิร์ฟเวอร์ในแต่ละการเชื่อมต่อพื้นฐาน ซึ่งหมายความว่าค่าที่ส่งคืนโดยฟังก์ชันไปยังไคลเอนต์ที่กำหนดเป็นAUTO_INCREMENTค่าแรกที่สร้างขึ้นสำหรับคำสั่งล่าสุดที่มีผลต่อAUTO_INCREMENTคอลัมน์โดยไคลเอ็นต์นั้น ค่านี้ไม่สามารถรับผลกระทบจากไคลเอนต์อื่นแม้ว่าพวกเขาสร้างAUTO_INCREMENTค่าของตนเอง พฤติกรรมนี้ทำให้มั่นใจได้ว่าลูกค้าแต่ละคนสามารถดึงข้อมูล ID ของตนเองได้โดยไม่ต้องกังวลกับกิจกรรมของลูกค้ารายอื่นและไม่จำเป็นต้องล็อคหรือทำธุรกรรม (ที่มา) และแม้กระทั่งไปไกลถึงจะบอกว่า: การใช้LAST_INSERT_ID()และAUTO_INCREMENTคอลัมน์พร้อมกันจากไคลเอนต์หลายคนถูกต้องสมบูรณ์ (ที่มา) มีความเสี่ยงหรือสถานการณ์ที่ทราบที่อาจทำให้LAST_INSERT_ID()ไม่คืนค่าที่ถูกต้องหรือไม่? ฉันใช้ MySQL 5.5 บน CentOS 5.5 x64 และ Fedora 16 x64 และเอ็นจิ้น InnoDB

3
ฉันจะรีเซ็ตตาราง mysql โดยอัตโนมัติเพิ่มขึ้นเป็น 1 ใน phpMyAdmin ได้อย่างไร
ฉันรู้ว่าใน MySQL ที่บรรทัดคำสั่งฉันสามารถรีเซ็ตเขตข้อมูลที่เพิ่มขึ้นอัตโนมัติของตารางเป็น 1 ด้วยสิ่งนี้: ALTER TABLE tablename AUTO_INCREMENT = 1 ฉันอยากรู้ว่ามีวิธีการทำเช่นนี้จากภายใน phpMyAdmin มีบางอย่างเช่นกล่องกาเครื่องหมายเพื่อรีเซ็ตการเพิ่มอัตโนมัติหรืออย่างอื่นตามบรรทัดเหล่านั้นหรือไม่ ไม่ใช่ว่ามีอะไรผิดปกติกับแนวทางบรรทัดคำสั่ง อีกหนึ่งสิ่งที่อยากรู้อยากเห็นที่ฉันคิด ... ขอขอบคุณล่วงหน้า!

8
เหตุผลในการหลีกเลี่ยงค่า ID ขนาดใหญ่
เรากำลังทำงานกับเว็บแอปพลิเคชันซึ่งผู้ใช้ยังไม่สามารถเข้าถึงได้ เจ้านายของฉันสังเกตเห็นว่าระเบียนที่สร้างขึ้นใหม่ได้รับ ID มากกว่า 10,000 รายการแม้ว่าเราจะมีระเบียนน้อยกว่า 100 รายการในตาราง เธอคิดว่าเว็บอินเตอร์เฟสด้วยเหตุผลบางอย่างสร้างเร็กคอร์ดชั่วคราวมากกว่า 100 เท่ามากกว่าเรคคอร์ดจริง (และลบทิ้ง) และสิ่งนี้สามารถนำเราให้วิ่งออกจากระยะภายในไม่กี่เดือนหลังจากปล่อย ฉันไม่คิดว่าเธอถูกต้องเกี่ยวกับสาเหตุของ ID อัตราเงินเฟ้อ (เพื่อนร่วมงานที่สามารถตอบคำถามนี้ในวันหยุดดังนั้นเราไม่ทราบแน่นอน) แต่สมมติว่าเธอเป็น เธอบอกว่าเธอเกลียดที่จะใช้คอลัมน์ bigint และเธอต้องการให้เราหยุดการสร้างคอลัมน์ ID โดยอัตโนมัติและเขียนรหัสฝั่งเซิร์ฟเวอร์ซึ่งเลือกจำนวนเต็ม "ไม่ได้ใช้" แรกและใช้เป็น ID ฉันเป็นนักเรียนที่จบการศึกษาด้านวิทยาศาสตร์คอมพิวเตอร์พร้อมประสบการณ์การใช้งานเพียงเล็กน้อยโดยเติมบทบาทนักพัฒนารุ่นเยาว์ เธอมีประสบการณ์หลายปีในการจัดการฐานข้อมูลทั้งหมดขององค์กรของเราและออกแบบส่วนใหญ่ ฉันคิดว่าว่าเธอไม่ถูกต้องในกรณีนี้รหัสประจำตัวที่ยิ่งใหญ่นั้นไม่มีอะไรต้องกลัว แต่ฉันยังไม่เชื่อคำตัดสินของฉัน อะไรคือข้อโต้แย้งสำหรับและต่อต้านแต่ละตำแหน่ง? มีอะไรที่ไม่ดีเกิดขึ้นได้ถ้าเราใช้ป้ายกำกับขนาดใหญ่และอะไรคืออันตรายของการคิดค้นฟังก์ชั่นการเติมล้ออัตโนมัติ? มีวิธีที่สามซึ่งดีกว่าอย่างใดอย่างหนึ่ง? เหตุผลของเธออาจเป็นเพราะต้องการหลีกเลี่ยงเงินเฟ้อของค่า ID ใบหน้า? ฉันสนใจที่จะฟังเกี่ยวกับเหตุผลในทางปฏิบัติด้วยเช่นกันบางทีรหัสประจำตัวขนาดใหญ่อาจใช้งานได้ในทางทฤษฎี แต่ก็ปวดหัวในทางปฏิบัติ แอปพลิเคชันไม่คาดว่าจะจัดการกับข้อมูลจำนวนมาก ฉันสงสัยว่ามันจะถึง 10,000 บันทึกจริงภายในไม่กี่ปีถัดไป หากมันสร้างความแตกต่างเรากำลังใช้เซิร์ฟเวอร์ Microsoft SQL แอปพลิเคชั่นเขียนด้วยภาษา C # และใช้ Linq …

3
รีเซ็ตค่าตัวตน
ฉันมีตารางที่มีคอลัมน์ประจำตัว ในขณะที่กำลังพัฒนาฉันจะลบแถวเป็นครั้งคราวและเพิ่มอีกครั้ง แต่ค่าตัวตนต่าง ๆ เพิ่มขึ้นเรื่อย ๆ และไม่ได้เริ่มต้นจาก 1 เมื่อฉันเพิ่มพวกเขาอีกครั้ง ตอนนี้รหัสของฉันไปจาก 68 -> 92 และนี่ทำให้รหัสของฉันล่ม ฉันจะรีเซ็ตค่าตัวตนได้อย่างไร

1
การแก้ไขโครงสร้างตารางเพื่อหลีกเลี่ยง `ข้อผิดพลาด: ค่าคีย์ที่ซ้ำกันละเมิดข้อ จำกัด ที่ไม่ซ้ำกัน '
ฉันมีตารางที่สร้างขึ้นด้วยวิธีนี้: -- -- Table: #__content -- CREATE TABLE "jos_content" ( "id" serial NOT NULL, "asset_id" bigint DEFAULT 0 NOT NULL, ... "xreference" varchar(50) DEFAULT '' NOT NULL, PRIMARY KEY ("id") ); ต่อมาบางแถวจะถูกแทรกโดยระบุรหัส: INSERT INTO "jos_content" VALUES (1,36,'About',...) ที่จุดภายหลังบางระเบียนจะถูกแทรกโดยไม่ต้อง ID Error: duplicate key value violates unique constraintและพวกเขาล้มเหลวกับข้อผิดพลาด: เห็นได้ชัดว่า id ได้รับการกำหนดเป็นลำดับ: การแทรกที่ล้มเหลวแต่ละครั้งจะเพิ่มตัวชี้ในลำดับจนกระทั่งมันเพิ่มขึ้นเป็นค่าที่ไม่มีอยู่อีกต่อไปและการสืบค้นสำเร็จ …

4
เพิ่มการรวมอัตโนมัติลงใน PK ที่มีอยู่
ฉันสร้างตารางในฐานข้อมูลที่มีอยู่แล้วในฐานข้อมูลอื่น เริ่มแรกมีการเติมข้อมูลฐานข้อมูลเก่า PK ของตารางจะต้องได้รับค่าที่มีอยู่แล้วในบันทึกเหล่านั้นดังนั้นจึงไม่สามารถสร้างอัตโนมัติได้ ตอนนี้ฉันต้องการตารางใหม่เพื่อให้มี PK เป็น autoincrement แต่ฉันจะทำอย่างนั้นหลังจากที่มี PK อยู่แล้วและมีข้อมูลได้อย่างไร

2
ฉันจะระบุได้อย่างไรว่าคอลัมน์ควรเพิ่มขึ้นอัตโนมัติใน pgAdmin
ฉันได้เริ่มเรียนรู้ pgAdmin III เพื่อจัดการฐานข้อมูล PostgreSQL แต่มันไม่ใช่แอพพลิเคชั่นที่ใช้งานง่าย หากฉันสร้างหรือสร้างตารางด้วย pgAdmin III ฉันจะเพิ่ม "ฟังก์ชันเพิ่มค่าอัตโนมัติ" ในคอลัมน์รหัสที่มีจำนวนเต็มประเภทได้อย่างไร

2
มีการจัดการคีย์ auto_increment ใน INSERT อย่างไร (เลือก * จาก ... )
ฉันมีtable1และtable2ใน MySQL ทั้งสองมีหลักสำคัญauto_incrementid หากตาราง schemas ตรงกันและฉันจะINSERT INTO table1 (SELECT * FROM table2)เกิดอะไรขึ้นเกี่ยวกับแถวใหม่ที่แทรกเข้าไปtable1? พวกเขาเก็บidค่าเก่าของพวกเขาและสร้างความขัดแย้งเมื่อแถวจากtable1มีเหมือนกันidหรือไม่ ค่าใหม่ถูกสร้างขึ้นโดย auto_increment หรือไม่ มันขึ้นอยู่กับเครื่องมือจัดเก็บหรือล็อค?

1
สร้างคีย์หลักอัตโนมัติใน CREATE TABLE … AS SELECT
CREATE TABLE ... AS SELECT...ฉันสร้างตารางโดยใช้ความซับซ้อนแบบสอบถามเลือกผ่าน ฉันจะเพิ่มคีย์หลักการสร้างอัตโนมัติในแบบสอบถามนี้ได้อย่างไร ตัวอย่างเช่น: create table `user_mv` select `user`.`firstname` as `firstname`, `user`.`lastname` as `lastname`, `user`.`lang` as `lang`, `user`.`name` as `user_name`, `group`.`name` as `group_name` from `user` inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`) left join `group` on (`group`.`group_id`=`user_groups`.`group_id`) where `user`.`lang`=`group`.`lang` แบบสอบถามนี้จะสร้างตารางที่มีfirstname, lastname, lang, username, group_nameคอลัมน์ ฉันต้องการให้มีidคอลัมน์ที่เป็นคีย์หลักของการสร้างอัตโนมัติ มีวิธีใดในการทำเช่นนี้โดยเปลี่ยนคิวรีนี้ ฉันรู้ว่าฉันสามารถทำได้โดยการเปลี่ยนตารางหลังจากดำเนินการแบบสอบถามนี้ แต่ถ้ามีวิธีใดที่จะทำสิ่งนี้โดยตรงในcreate tableคำสั่งฉันต้องการทราบวิธีการทำเช่นนั้น

4
คอลัมน์รหัสประจำตัวอีกครั้ง: เมื่อจำเป็นหรือไม่
ในช่วงหนึ่งของบทเรียนสุดท้ายที่มหาวิทยาลัย (ฉันเป็นนักเรียน) อาจารย์ขอให้เราพัฒนาฐานข้อมูล (MySQL Server ถ้ามันเป็นเรื่องสำคัญ) และแอปไคลเอ็นต์ขนาดเล็กที่ใช้ฐานข้อมูลเป็นแหล่งข้อมูล หนึ่งในข้อกำหนดคือคอลัมน์ประจำตัว (ซึ่งคือ PK ในทุกตาราง) จะต้องเรียงตามลำดับเพราะเป็นการปฏิบัติที่ดี (ตามคำของอาจารย์) กล่าวคือเมื่อลบแถวของตารางจะต้องมีการนำ PK กลับมาใช้ใหม่ในส่วนแทรกภายหลัง ฉันมีความรู้โดยเฉลี่ยเกี่ยวกับ RDBMS, PKs และคอลัมน์ข้อมูลประจำตัว จากสิ่งที่ฉันเข้าใจคอลัมน์ข้อมูลประจำตัวนั้นเป็นเพียงวิธีให้ DB สร้างอัตโนมัติ PK เมื่อแทรกแถวและไม่มีอะไรเพิ่มเติม และค่าคอลัมน์ข้อมูลประจำตัวจะไม่เกี่ยวข้องกับแอตทริบิวต์แถวในทางใด ๆ (ตราบใดที่มันไม่ใช่คีย์ธรรมชาติ) ข้อกำหนดนี้ (คอลัมน์ข้อมูลประจำตัวตามลำดับอย่างเคร่งครัด) เป็นที่น่าสงสัยสำหรับฉัน ฉันพยายามถามอาจารย์ว่าเกิดอะไรขึ้นถ้าตัวตนไม่ได้เรียงตามลำดับ (ด้วยช่องว่างที่เกิดจากการลบ) แต่ได้คำตอบที่เป็นนามธรรมเช่น "สะดวกสำหรับผู้ใช้และเป็นประโยชน์สำหรับผู้ดูแลฐานข้อมูลที่ดูแลฐานข้อมูล" ไม่มีตัวอย่างเฉพาะ อาร์กิวเมนต์ "สะดวกสำหรับผู้ใช้" ฟังดูไม่ดีเพราะไม่มีความหมายใด ๆ ในโดเมนธุรกิจ ดังนั้นฉันอยากรู้ว่าเหตุผลเหล่านี้เป็นจริงหรือไม่ ฉันสามารถคิดได้เพียงกรณีเดียวเท่านั้นที่ต้องมีการระบุคอลัมน์ข้อมูลประจำตัวใหม่ - เมื่อพื้นที่ข้อมูลส่วนบุคคลหมดแล้ว แต่นี่เป็นปัญหาการออกแบบที่มากขึ้นเมื่อเลือกคอลัมน์ประเภทข้อมูลระบุตัวตนไม่ถูกต้องพูดง่าย ๆintแทนbigintหรือuniqueidentifierเมื่อตารางมีจำนวนพันล้านแถว สมมติว่าคอลัมน์ข้อมูลประจำตัวเป็นดัชนีกลุ่ม: ช่องว่างในคอลัมน์ข้อมูลระบุตัวตนมีผลต่อประสิทธิภาพของดัชนีหรือไม่ อาจจะมีเหตุผลอื่น …

1
ทำไมการเพิ่มอัตโนมัติถึงกระโดดเกินจำนวนแถวที่แทรกเข้าไป
ฉันรู้สึกยุ่งเหยิงมากจากพฤติกรรมแปลก ๆ นี้ที่ฉันเห็นในauto_incrementค่าที่บันทึกไว้ใน bidID ของตารางการเสนอราคาหลังจากทำการแทรกจำนวนมากโดยใช้ขั้นตอนที่เก็บไว้: INSERT INTO Bids (itemID, buyerID, bidPrice) SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice) FROM Items WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows; ตัวอย่างเช่นหากauto_incrementค่า bidID คือ 101 เมื่อเริ่มต้นและฉันแทรก 100 แถวค่าสิ้นสุดจะกลายเป็น 213 แทนที่จะเป็น 201 อย่างไรก็ตาม BidIDs ของแถวที่แทรกเหล่านั้นจะทำงานตามลำดับสูงสุด 201 มีการตรวจสอบดังต่อไปนี้ …

4
MySQL: เหตุใด auto_increment จึง จำกัด เฉพาะแค่คีย์หลัก?
ฉันรู้ว่า MySQL จำกัด คอลัมน์ auto_increment ไว้ที่คีย์หลัก ทำไมนี้ ความคิดแรกของฉันคือมันเป็นข้อ จำกัด ด้านประสิทธิภาพเนื่องจากอาจมีบางตัวนับตารางบางแห่งที่ต้องถูกล็อคเพื่อรับค่านี้ ทำไมฉันจึงไม่มีคอลัมน์ auto_increment หลายคอลัมน์ในตารางเดียวกัน ขอบคุณ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.