ארכיון תגיות: mySql

איך לאפשר שמות טבלאות עם אותיות גדולות ב- MySql / MariaDB ?

כשעובדים על מערכת ההפעלה Windows עם MariaDB , אז ברירת המחדל היא שכל שמות הטבלאות הן קטנות.

זו בעיה כמובן, כי היינו מעדיפים להכניס אותיות גדולות בשמות הטבלאות.

הצורה לשנות זאת, היא באמצעות משתנה ברירת מחדל.

ראשית נמצא את קובץ ההגדרות, הוא יכול להיקרא my.cnf או my.ini

הוא יכול להימצא בהרבה מקומות, ראו כאן, בחלק שעוסק ב- Windows,

אני מצאתי אותו תחת C:\Program Files\MariaDB 10.2\data\my.ini

נערוך את הקובץ – ונכניס בתוכו את השורה הבאה

[mysqld]

lower_case_table_names=2

חשוב לשים לב שהשורה יושבת תחת כותרת [mysqld] , ואם אין כזו – אז צריך להוסיף אותה.

לאחר מכן – צריך לעשות restart ל- service הרלוונטי ( דרך Services של Windows ) .

בהצלחה.

מקורות :

https://mariadb.com/kb/en/the-mariadb-library/identifier-case-sensitivity/

https://mariadb.com/kb/en/the-mariadb-library/configuring-mariadb-with-mycnf/

שאילתא שמוצאת רשומות שבהן המפתח הזר לא קיים בטבלת המקור

יש כמה צורות למצוא רשומות "בעיתיות" שבהם יש מפתח זר, אך מסיבה כלשהיא , אין את רשומת המקור בטבלה הזרה .

הצורה הכי פשוטה ( בעיני ) היא כך

SELECT * FROM doc_recive where dr_id not in (SELECT dr_id from doctors where doctors.dr_id=doc_recive.dr_id)

יש כל מיני טכניקות לעשות את השאילתות האלו יותר יעילות

אפשר להשתמש ב-Not Exists , או ב Is null

ולמי שרוצה להתעמק – יש בקישור הזה השוואה

 

פתרון קליל לבעית MYSQL : "THE USER SPECIFIED AS A DEFINER ('ROOT'@'%') DOES NOT EXIST"

יצא לי להעביר דאטאבייס משרת לשרת,
כאשר שיניתי גם את שם היוזר בדאטאבייס
כולם ב-MySql

עכשיו, אחת מהגדרות האבטחה כשיוצרים VIEW או FUNCTION או STORE PROCEDURE ב- MYSQL היא
שמוגדר היוזר שיצר את הפונקציה/תצוגה בתור DENIFNER
ורק הוא יכול להריץ אותה.

יש המון שאלות באינטרנט על איך פותרים מצב כזה

הפתרון הכי פשוט שאני מצאתי מניח שיש לכם גיבוי של הדאטאבייס , ואתם מריצים את MySql Bench
במקרה כזה
ב-MySql Bench אפשר עם מקש ימני להקליד עם ה-VIEW לדוגמא, ולבחור ALTER VIEW
ואז נעתיק את הקוד של ה-VIEW, נשנה מה שצריך
נוסיף בהתחלה משפט שמוחק את ה-VIEW הישן, וניצור בעצם VIEW חדש שבו מוגדר בתור DEFINER היוזר החדש שלנו

בהצלחה!

לגבי המאפיין Definer ב- MySql

ב-MySql כל פעם שמגדירים פונקציה, StoreProcudure או View,
חובה להגדיר Definer מייד אחרי המילה Create

עכשיו – כל עוד אתה עובד על המחשב שלך, יש לך הרשאות admin בשרת MySql

אבל אם סביבת ה-"Production" שלך היא של אירוח שיתופי (Shared Hosting)
אז בדרך כלל אין לך הרשאות admin
ואז – הפרמטר המקובל הבא – יגרום לתקלה

DEFINER=`root`@`localhost`

אז יש כל מיני פתרונות לזה,
אבל בגדול – אי אפשר לעקוף את הדרישה הזו.
העניין היחיד הוא לזכור שכאשר מעלים את הדאטאבייס לשרת – צריך להוריד את המאפיין הזה.

להלן פתרון אחד…

Removing DEFINER from MySQL Dump

איך עושים Join של 2 שדות מאותה טבלת מקור

שלום,
היה לי מקרה שבו
שדות מוצא+יעד היו מאותה טבלת מקור

ב-MySql עושים זאת כך :
1. אחרי הפסוקית Inner Join רושמים את שם הטבלה המקורית…רווח… ואז כינוי יחודי
כלומר,
במקרה שלנו , במשפט Inner Join הראשון הענקתי כינוי יחודי מסוים
ובמשפט Inner Join השני – הענקתי כינוי מסוים ***שונה***
2. אחרי הפסוקית ON, משתמשים בכינוי היחודי מהסעיף הקודם (בטבלה שאחרי הסימן = כמובן).
3. גם ברשימת השדות לתצוגה , משתמשים בכינויים היחודיים (ולא בשם הטבלה המקורי)
4. אחרי שם העמודה ברשימת השדות, צריך לתת לכל עמודה כינוי יחודי
אומנם ה-MySql WorkBench יודע להציג זאת, אבל אם תנסו להחזיר נתונים ב-php וכדומה …. זה יהיה בעיה
אם יהיו 2 עמודות עם אותו השם.

להלן דוגמא :

SELECT 
    t.travel_id,
    t.travel_date,
    t.travel_time,
    tbl_customers.company_name,
    t.travel_box
	,tbl_lines.line_name
	,t.customer_name
	,t.quantity
	,f1.location from1
	,t1.location to1

FROM
    tbl_travels t
        INNER JOIN tbl_customers
		ON t.company_id = tbl_customers.customer_id
        INNER JOIN tbl_lines
		ON t.line_id= tbl_lines.line_id
        INNER JOIN tbl_locations f1
		ON t.`from`= f1.location_id 
		INNER JOIN tbl_locations t1
		ON t.`to`= t1.location_id