Pembatas di MySQL

165

Saya sering melihat orang menggunakan Pembatas. Saya mencoba sendiri untuk mencari tahu apa pembatas dan apa tujuan mereka. Setelah 20 menit googling, saya tidak dapat menemukan jawaban yang memuaskan saya. Jadi, pertanyaan saya sekarang: Apa itu pembatas dan kapan saya harus menggunakannya?

System.Data
sumber

Jawaban:

246

Pembatas selain standar ;biasanya digunakan ketika mendefinisikan fungsi, prosedur yang tersimpan, dan pemicu di mana Anda harus mendefinisikan banyak pernyataan. Anda mendefinisikan pembatas berbeda seperti $$yang digunakan untuk menentukan akhir dari seluruh prosedur, tetapi di dalamnya, masing-masing pernyataan diakhiri oleh ;. Dengan begitu, ketika kode dijalankan di mysqlklien, klien dapat mengetahui di mana seluruh prosedur berakhir dan menjalankannya sebagai unit daripada mengeksekusi pernyataan individu di dalamnya.

Perhatikan bahwa DELIMITERkata kunci adalah fungsi dari mysqlklien baris perintah (dan beberapa klien lain) saja dan bukan fitur bahasa MySQL biasa. Ini tidak akan berhasil jika Anda mencoba meneruskannya melalui API bahasa pemrograman ke MySQL. Beberapa klien lain seperti PHPMyAdmin memiliki metode lain untuk menentukan pembatas non-default.

Contoh:

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 ;

Mencoba menggunakan DELIMITERklien yang tidak mendukungnya akan menyebabkannya dikirim ke server, yang akan melaporkan kesalahan sintaksis. Misalnya, menggunakan PHP dan MySQLi:

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

Kesalahan dengan:

Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'DELIMITER $$' di baris 1

Michael Berkowski
sumber
3
Apa skenario di mana masuk akal untuk menggunakan pembatas? Saya tidak benar-benar mengerti.
System.Data
2
@ System.Data Kalimat pertama jawaban saya - ketika mendefinisikan prosedur tersimpan, fungsi khusus, dan pemicu. Kapan saja banyak pernyataan dieksekusi sebagai satu unit pada baris perintah MySQL.
Michael Berkowski
2
Perhatikan bahwa perintah DELIMITER tidak berfungsi dari PhpMyAdmin SQL (setidaknya, beberapa versi). Sebagai gantinya, Anda bisa mengatur pembatas di bidang terpisah ke SQL itu sendiri. Ini membuat saya bingung untuk beberapa waktu ... :-)
Sangat tidak teratur
1
@MichaelBerkowski, Semoga kita akan mendapatkan cara untuk melakukannya di masa depan.
Pacerier
1
@StockB Jawaban ini tidak benar-benar tentang mengapa prosedur tersimpan bermanfaat, penyebutan "satu unit" mengacu pada bagaimana MySQL akan dapat menginterpretasikan SP ketika menguraikannya: temukan batas-batas unit dengan pembatas, kemudian parsing pernyataan individual di dalamnya. Tetapi karena Anda bertanya, menggunakan SP multi-pernyataan akan memungkinkan Anda untuk menyembunyikan detail implementasi dari aplikasi yang memanggil SP. Kode aplikasi tidak perlu khawatir dengan apa yang dieksekusi SQL (dan Anda bisa mengubahnya jika perlu) selama itu mengembalikan hasil yang konsisten. Sama seperti fungsi dalam kode.
Michael Berkowski
21

Pernyataan DELIMITER mengubah pembatas standar yang merupakan titik koma (;) ke yang lain. Pembatas diubah dari titik koma (;) menjadi garis miring ganda //.

Mengapa kita harus mengubah pembatas?

Karena kami ingin meneruskan prosedur tersimpan, fungsi khusus, dll ke server secara keseluruhan daripada membiarkan alat mysql untuk menginterpretasikan setiap pernyataan sekaligus.

Pradeep Singh
sumber
13

Saat Anda membuat rutin yang tersimpan yang memiliki BEGIN...ENDblok, pernyataan di dalam blok diakhiri dengan tanda titik koma (;). Namun CREATE PROCEDUREpernyataan itu juga membutuhkan terminator. Jadi menjadi ambigu apakah titik koma dalam tubuh rutin berakhir CREATE PROCEDURE, atau mengakhiri salah satu pernyataan dalam tubuh prosedur.

Cara untuk menyelesaikan ambiguitas adalah dengan mendeklarasikan string yang berbeda (yang tidak boleh terjadi dalam tubuh prosedur) yang diakui oleh klien MySQL sebagai terminator sebenarnya untuk CREATE PROCEDUREpernyataan tersebut.

Rizwan Ahmed
sumber
1
Ini adalah jawaban terbaik karena ini memberi tahu alasan yang benar untuk menggunakan DELIMITER dengan cara paling sederhana dan tanpa menimbulkan kebingungan. Terima kasih
Fakhar Anwar
6

Pembatas adalah karakter atau serangkaian karakter yang akan Anda gunakan untuk memberi tahu klien MySQL bahwa Anda telah selesai mengetikkan pernyataan Sql.

Kaumadie Kariyawasam
sumber
5

Anda mendefinisikan DELIMITER untuk memberi tahu klien mysql untuk memperlakukan pernyataan, fungsi, prosedur tersimpan atau pemicu sebagai keseluruhan pernyataan. Biasanya dalam file .sql Anda menetapkan DELIMITER berbeda seperti $$. Perintah DELIMITER digunakan untuk mengubah pembatas standar dari perintah MySQL (yaitu;). Karena pernyataan dalam rutinitas (fungsi, prosedur tersimpan atau pemicu) diakhiri dengan titik koma (;), untuk memperlakukannya sebagai pernyataan majemuk, kami menggunakan DELIMITER. Jika tidak ditentukan saat menggunakan rutinitas berbeda di file atau baris perintah yang sama, itu akan memberikan kesalahan sintaksis.

Perhatikan bahwa Anda dapat menggunakan berbagai karakter yang tidak disediakan untuk membuat pembatas kustom Anda sendiri. Anda harus menghindari penggunaan karakter backslash (\) karena itulah karakter escape untuk MySQL.

DELIMITER sebenarnya bukan perintah bahasa MySQL, ini perintah klien.

Contoh

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 ;
Pengoptimal
sumber
Anda dapat menambahkan pembatas untuk menentukan rentang kode prosedur mysql Anda. Untuk detail lebih lanjut, lihat bagian terakhir tutorial saya techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh
1

DELIMITER memberi tahu klien mysql untuk memperlakukan pernyataan, fungsi, prosedur tersimpan atau pemicu sebagai keseluruhan pernyataan. Biasanya dalam a. sql Anda menetapkan DELIMITER berbeda seperti $$. Perintah DELIMITER digunakan untuk mengubah pembatas standar dari perintah MySQL

Vihanga Sahan
sumber
1

Pembatas adalah karakter dalam SQL yang digunakan untuk memisahkan item data dalam database. Ini mengidentifikasi awal dan akhir dari string karakter. Secara umum, pembatas yang digunakan dalam SQL adalah ';'.

Wenusara Kappetige
sumber