ตัวคั่นใน MySQL


165

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

คำตอบ:


246

ตัวคั่นอื่นนอกเหนือจากค่าเริ่มต้น ;มักจะใช้เมื่อกำหนดฟังก์ชั่นขั้นตอนการจัดเก็บและทริกเกอร์นั้นคุณจะต้องกำหนดหลายคำสั่ง คุณกำหนดตัวคั่นแตกต่างกันเช่น$$ที่ใช้ในการกำหนดจุดสิ้นสุดของขั้นตอนทั้งหมด ;แต่ภายในนั้นงบของแต่ละบุคคลแต่ละยกเลิกโดย ด้วยวิธีนี้เมื่อมีการเรียกใช้รหัสในmysqlไคลเอนต์ลูกค้าสามารถบอกได้ว่ากระบวนการทั้งหมดสิ้นสุดลงแล้วและเรียกใช้งานเป็นหน่วยแทนที่จะเรียกใช้คำสั่งแต่ละรายการภายใน

โปรดทราบว่าDELIMITERคำหลักเป็นฟังก์ชั่นของmysqlไคลเอนต์บรรทัดคำสั่ง(และไคลเอนต์อื่น ๆ ) เท่านั้นและไม่ใช่คุณสมบัติภาษา MySQL ปกติ มันจะไม่ทำงานถ้าคุณพยายามส่งผ่านภาษาการเขียนโปรแกรม API ไปยัง MySQL ไคลเอนต์อื่น ๆ เช่น PHPMyAdmin มีวิธีอื่นเพื่อระบุตัวคั่นที่ไม่ใช่ค่าเริ่มต้น

ตัวอย่าง:

DELIMITER $$
/* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */
DROP PROCEDURE my_procedure$$

/* Now start the procedure code */
CREATE PROCEDURE my_procedure ()
BEGIN    
  /* Inside the procedure, individual statements terminate with ; */
  CREATE TABLE tablea (
     col1 INT,
     col2 INT
  );

  INSERT INTO tablea
    SELECT * FROM table1;

  CREATE TABLE tableb (
     col1 INT,
     col2 INT
  );
  INSERT INTO tableb
    SELECT * FROM table2;
  
/* whole procedure ends with the custom delimiter */
END$$

/* Finally, reset the delimiter to the default ; */
DELIMITER ;

ความพยายามที่จะใช้DELIMITERกับไคลเอนต์ที่ไม่สนับสนุนจะทำให้มันถูกส่งไปยังเซิร์ฟเวอร์ซึ่งจะรายงานข้อผิดพลาดทางไวยากรณ์ ตัวอย่างเช่นการใช้ PHP และ MySQLi:

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;

ข้อผิดพลาดกับ:

คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้กับ 'DELIMITER $$' ที่บรรทัด 1


3
สถานการณ์อะไรที่เหมาะสมที่จะใช้ตัวคั่น ฉันไม่ได้รับมันจริงๆ
System.Data

2
@ System.Data ประโยคแรกของคำตอบของฉัน - เมื่อกำหนดกระบวนงานที่เก็บไว้ฟังก์ชันที่กำหนดเองและทริกเกอร์ เมื่อใดก็ตามที่มีการเรียกใช้หลายงบเป็นหนึ่งหน่วยบนบรรทัดคำสั่ง MySQL
Michael Berkowski

2
โปรดทราบว่าคำสั่ง DELIMITER ไม่ทำงานจาก PhpMyAdmin SQL (อย่างน้อยบางรุ่น) คุณสามารถตั้งค่าตัวคั่นในเขตข้อมูลแยกต่างหากเป็น SQL แทน เรื่องนี้ทำให้ฉันสับสนไปซักพัก ... :-)
สูงผิดปกติ

1
@MichaelBerkowski หวังว่าเราจะมีวิธีในอนาคต
Pacerier

1
@StockB คำตอบนี้ไม่ได้เกี่ยวกับสาเหตุที่ขั้นตอนการจัดเก็บมีประโยชน์กล่าวถึง "หนึ่งหน่วย" อ้างถึงว่า MySQL จะสามารถตีความ SP เมื่อแยกวิเคราะห์: ค้นหาขอบเขตของหน่วยโดยตัวคั่นแล้วแยกงบบุคคลภายใน แต่เมื่อคุณถามการใช้ SP หลายคำสั่งจะช่วยให้คุณสามารถซ่อนรายละเอียดการใช้งานจากแอปพลิเคชันที่เรียก SP รหัสแอปพลิเคชันไม่จำเป็นต้องเกี่ยวข้องกับสิ่งที่ SQL ดำเนินการ (และคุณสามารถเปลี่ยนแปลงได้ถ้าจำเป็น) ตราบเท่าที่มันส่งคืนผลลัพธ์ที่สอดคล้องกัน เช่นเดียวกับฟังก์ชั่นในรหัส
Michael Berkowski

21

คำสั่ง DELIMITER เปลี่ยนตัวคั่นมาตรฐานซึ่งเป็นเครื่องหมายอัฒภาค (;) เป็นตัวคั่นอื่น ตัวคั่นจะเปลี่ยนจากเซมิโคลอน (;) เป็น double-slashes //

ทำไมเราต้องเปลี่ยนตัวคั่น?

เนื่องจากเราต้องการส่งผ่านโพรซีเดอร์ที่เก็บไว้ฟังก์ชันที่กำหนดเอง ฯลฯ ไปยังเซิร์ฟเวอร์โดยรวมแทนที่จะปล่อยให้เครื่องมือ mysql ตีความแต่ละคำสั่งในแต่ละครั้ง


13

เมื่อคุณสร้างกิจวัตรประจำวันการจัดเก็บที่มีบล็อกงบภายในบล็อกจะถูกยกเลิกโดยอัฒภาคBEGIN...END (;)แต่CREATE PROCEDUREคำสั่งยังต้องการเทอร์มิเนเตอร์ ดังนั้นจึงไม่ชัดเจนว่าเครื่องหมายอัฒภาคในเนื้อความของชุดคำสั่งสิ้นสุดลงCREATE PROCEDUREหรือยกเลิกหนึ่งในคำแถลงภายในเนื้อหาของกระบวนงาน

วิธีการแก้ไขความคลุมเครือคือการประกาศสตริงที่แตกต่างกัน (ซึ่งจะต้องไม่เกิดขึ้นภายในเนื้อความของโพรซีเดอร์) ที่ไคลเอนต์ MySQL รับรู้ว่าเป็นตัวยุติที่แท้จริงสำหรับCREATE PROCEDUREคำสั่ง


1
นี่เป็นคำตอบที่ดีที่สุดเพราะมีการบอกเหตุผลที่ถูกต้องในการใช้ DELIMITER ในวิธีที่ง่ายที่สุดและไม่ทำให้เกิดความสับสน ขอบคุณ
Fakhar Anwar

6

ตัวคั่นคืออักขระหรือสตริงอักขระที่คุณจะใช้เพื่อบอกไคลเอ็นต์ MySQL ว่าคุณพิมพ์คำสั่ง Sql เสร็จแล้ว


5

คุณกำหนด DELIMITER เพื่อบอกให้ลูกค้า mysql ปฏิบัติต่อคำสั่งฟังก์ชั่นขั้นตอนการจัดเก็บหรือทริกเกอร์เป็นคำสั่งทั้งหมด โดยปกติในไฟล์. sql คุณจะตั้งค่าตัวแยกส่วนแบบอื่นเช่น $$ คำสั่ง DELIMITER ใช้เพื่อเปลี่ยนตัวคั่นมาตรฐานของคำสั่ง MySQL (เช่น;) ในฐานะที่เป็นคำสั่งภายในกิจวัตร (ฟังก์ชั่นขั้นตอนการจัดเก็บหรือทริกเกอร์) ลงท้ายด้วยเซมิโคลอน (;) เพื่อปฏิบัติต่อพวกเขาเป็นคำสั่งผสมที่เราใช้ DELIMITER หากไม่ได้กำหนดไว้เมื่อใช้งานประจำที่แตกต่างกันในไฟล์หรือบรรทัดคำสั่งเดียวกันมันจะให้ข้อผิดพลาดทางไวยากรณ์

โปรดทราบว่าคุณสามารถใช้อักขระที่ไม่สงวนไว้หลากหลายเพื่อสร้างตัวคั่นที่กำหนดเองของคุณ คุณควรหลีกเลี่ยงการใช้อักขระแบ็กสแลช (\) เพราะนั่นคืออักขระเลี่ยงสำหรับ MySQL

DELIMITER ไม่ใช่คำสั่งภาษา MySQL จริงๆมันเป็นคำสั่งไคลเอนต์

ตัวอย่าง

DELIMITER $$

/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$

/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ 
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN
    
    SELECT COUNT(*) INTO the_count FROM employees where department=the_department;

END$$

/*DELIMITER is set to it's default*/
DELIMITER ;

คุณสามารถเพิ่มตัวคั่นเพื่อกำหนดช่วงของโค้ดโพรซีเดอร์ mysql ของคุณ สำหรับรายละเอียดเพิ่มเติมโปรดดูที่ส่วนสุดท้ายของการกวดวิชาของฉันtechflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh

1

DELIMITER เพื่อบอกให้ลูกค้า mysql ปฏิบัติต่อคำสั่งฟังก์ชั่นขั้นตอนการจัดเก็บหรือทริกเกอร์เป็นคำสั่งทั้งหมด ปกติใน ไฟล์ sql ที่คุณตั้งค่าตัวแยกส่วนเช่น $$ คำสั่ง DELIMITER ใช้เพื่อเปลี่ยนตัวคั่นมาตรฐานของคำสั่ง MySQL


1

ตัวคั่นเป็นอักขระใน SQL ซึ่งใช้เพื่อแยกไอเท็มข้อมูลในฐานข้อมูล มันระบุจุดเริ่มต้นและจุดสิ้นสุดของสตริงตัวละคร โดยทั่วไปตัวคั่นที่ใช้ใน SQL คือ ';'

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