MySQL'deki sınırlayıcılar


165

Sıklıkla insanların Sınırlayıcılar kullandığını görüyorum. Sınırlayıcıların ne olduğunu ve amaçlarının ne olduğunu bulmaya çalıştım. 20 dakika ara verdikten sonra beni tatmin edecek bir cevap bulamadım. Şimdi sorum şu: Sınırlayıcılar nedir ve bunları ne zaman kullanmalıyım?

Yanıtlar:


246

Varsayılan dışındaki sınırlayıcılar ;genellikle işlevler, saklı yordamlar ve birden çok ifade tanımlamanız gereken tetikleyiciler tanımlanırken kullanılır. $$Tüm yordamın sonunu tanımlamak için kullanılan gibi farklı bir sınırlayıcı tanımlarsınız, ancak içinde ayrı ayrı deyimler tarafından sonlandırılır ;. Bu şekilde, kod mysqlistemcide çalıştırıldığında, istemci tüm yordamın nerede sona erdiğini söyleyebilir ve içindeki ifadeleri yürütmek yerine bir birim olarak yürütebilir.

DELIMITERAnahtar kelimenin komut satırının bir işlevi olduğunu unutmayınmysql normal bir MySQL dil özelliği değil, yalnızca istemcisinin (ve diğer bazı istemcilerin) . MySQL'e bir programlama dili API'sinden geçirmeye çalışırsanız çalışmaz. PHPMyAdmin gibi diğer bazı istemcilerde varsayılan olmayan bir sınırlayıcı belirtmek için başka yöntemler vardır.

Misal:

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İstemciyi desteklemeyen bir istemciyle kullanmaya çalışmak istemcinin sunucuya gönderilmesine neden olur ve bu da sözdizimi hatası verir. Örneğin, PHP ve MySQLi kullanarak:

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

Şununla ilgili hatalar:

SQL sözdiziminizde bir hata var; 1. satırda 'DELIMITER $$' yakınında kullanılacak doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın


3
Sınırlayıcı kullanmanın mantıklı olduğu senaryolar nelerdir? Gerçekten anlamadım.
System.Data

2
@ System.Data Cevabımın ilk cümlesi - saklı yordamları, özel işlevleri ve tetikleyicileri tanımlarken. MySQL komut satırında bir birim olarak birden çok deyim yürütüldüğünde.
Michael Berkowski

2
DELIMITER komutunun bir PhpMyAdmin SQL'den çalışmadığını unutmayın (en azından bazı sürümler). Bunun yerine, ayırıcıyı ayrı bir alanda SQL'in kendisine ayarlayabilirsiniz. Bu beni oldukça uzun bir süre karıştırdı ... :-)
Son derece Düzensiz

1
@MichaelBerkowski, Umarım gelecekte bunu yapmanın bir yolunu buluruz.
Pacerier

1
@StockB Bu cevap, saklı yordamların neden faydalı olduğu hakkında değildi, MySQL'in SP'yi ayrıştırırken nasıl yorumlayabileceğine ilişkin "bir birim" den bahsediyordu: sınırlayıcı tarafından birim sınırlarını bulun, sonra içindeki ifadeleri ayrıştırın. Ancak sorduğunuzdan, çok ifadeli bir SP kullanmak, uygulama ayrıntılarını SP'yi çağıran uygulamadan gizlemenize olanak tanır. Uygulama kodunun, SQL'in yürütüldüğü (ve gerekirse değiştirebilirsiniz) tutarlı bir sonuç döndürdüğü sürece ilgilenmesi gerekmez. Tıpkı koddaki bir işlev gibi.
Michael Berkowski

21

DELIMITER deyimi, noktalı virgül (;) olan standart sınırlayıcıyı diğerine değiştirir. Sınırlayıcı, noktalı virgül (;) yerine çift eğik çizgiler // olarak değiştirilir.

Sınırlayıcıyı neden değiştirmeliyiz?

Çünkü mysql aracının her ifadeyi aynı anda yorumlamasına izin vermek yerine saklı yordamı, özel işlevleri vb sunucuya bir bütün olarak aktarmak istiyoruz.


13

Bir BEGIN...ENDbloğu olan depolanmış bir yordam oluşturduğunuzda, blok içindeki ifadeler noktalı virgülle sonlandırılır (;). Ancak CREATE PROCEDUREifadenin de bir sonlandırıcıya ihtiyacı var. Bu nedenle, rutinin gövdesindeki noktalı virgülün yordamın CREATE PROCEDUREgövdesindeki ifadelerden birini sonlandırması veya sonlandırması belirsiz hale gelir .

Belirsizliği çözmenin yolu, MySQL istemcisinin CREATE PROCEDUREifadenin gerçek sonlandırıcısı olarak tanıdığı farklı bir dize (yordamın gövdesinde gerçekleşmemesi gerekir) bildirmektir .


1
Bu en iyi yanıttır çünkü DELIMITER'ı en basit şekilde ve herhangi bir karışıklığa yol açmadan kullanmak için doğru nedeni söylüyor. Teşekkürler
Fakhar Anwar

6

Sınırlayıcı, MySQL istemcisine bir Sql deyimiyle yazmayı bitirdiğinizi bildirmek için kullanacağınız karakter veya karakter dizisidir.


5

Mysql istemcisine deyimleri, işlevleri, saklı yordamları veya tetikleyicileri bir deyim olarak ele almasını bildirmek için bir DELIMITER tanımlarsınız. Normalde bir .sql dosyasında $$ gibi farklı bir DELIMITER ayarlarsınız. DELIMITER komutu MySQL komutlarının standart sınırlayıcısını değiştirmek için kullanılır (yani;). Rutinlerdeki (işlevler, saklı yordamlar veya tetikleyiciler) ifadeler bir noktalı virgülle (;) sona erdiğinden, bunları bileşik bir deyim olarak ele almak için DELIMITER kullanıyoruz. Aynı dosya veya komut satırında farklı rutinler kullanılırken tanımlanmazsa, sözdizimi hatası verir.

Kendi özel sınırlayıcınızı oluşturmak için ayrılmamış çeşitli karakterler kullanabileceğinizi unutmayın. Ters eğik çizgi (\) karakterini kullanmaktan kaçınmalısınız çünkü bu MySQL için çıkış karakteridir.

DELIMITER gerçekten bir MySQL dil komutu değil, bir istemci komutudur.

Misal

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 yordam kodunuzun aralığını tanımlamak için ayırıcı ekleyebilirsiniz. Daha fazla ayrıntı için benim öğretici son bölümüne bakın techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh

1

DELIMITER mysql istemcisine deyimleri, işlevleri, saklı yordamları veya tetikleyicileri bir deyim olarak ele almasını söyler. Normalde a. sql dosyasını $$ gibi farklı bir DELIMITER ayarladınız. DELIMITER komutu MySQL komutlarının standart sınırlayıcısını değiştirmek için kullanılır


1

Sınırlayıcı, SQL'deki bir veritabanındaki veri öğelerini ayırmak için kullanılan bir karakterdir. Karakter dizesinin başlangıcını ve sonunu tanımlar. Genellikle, SQL'de kullanılan sınırlayıcı ';' dir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.