MySQL විදේශ යතුරු සීමා පැහැදිලි කිරීම: සැකසීම, විකල්ප, ගැටළු විසඳීම සහ හොඳම ක්‍රම

目次

1. හැඳින්වීම

MySQL විදේශීය යතුර සීමාවන් යනු දත්ත සමුදාය සැලසුම්කරණයේදී අත්‍යවශ්‍ය අංගයකි. විදේශීය යතුර සීමාවන් භාවිතා කිරීමෙන්, ඔබට වගුවල අතර සම්බන්ධතා නිර්වචනය කළ හැකි අතර දත්ත අඛණ්ඩතාවය පවත්වා ගත හැක. මෙම ලිපියෙන් විදේශීය යතුර සීමාවන්හි මූලික දේ සිට ආරම්භ කර විශේෂ සැකසුම් ක්‍රම සහ ගැටලු විසඳීමේ තාක්ෂණයන් දක්වා සියල්ල පැහැදිලිව පැහැදිලි කර ඇත.

විදේශීය යතුර සීමාවන්හි අරමුණ

විදේශීය යතුර සීමාවන්හි ප්‍රධාන අරමුණු පහත පරිදිය:

  1. දත්ත ස්ථිරභාවය සහතික කිරීම දරු වගුවේ ලියාපදිංචි කර ඇති දත්ත පියා වගුවේ නොමැති නම්, දෝෂයක් ජනනය වේ.
  2. ආශ්‍රිත අඛණ්ඩතාවය පවත්වා ගැනීම පියා වගුවේ දත්ත වෙනස් කරන ලෙස හෝ මකන ලෙස කළ විට, එය දරු වගුවට බලපාන ආකාරය පාලනය කළ හැක.
  3. සැලසුම් දෝෂ වැළැක්වීම සංවර්ධනයේ මුල් අදියරවලදී සීමාවන් සකස් කිරීමෙන්, අනපේක්ෂිත දත්ත නොගැලපීම් වළක්වා ගත හැක.

මෙම ලිපියෙන් ඔබ ඉගෙන ගන්නා දේ

මෙම ලිපිය කියවීමෙන්, ඔබට පහත කුසලතා ලැබෙනු ඇත:

  • විදේශීය යතුර සීමාවන්හි මූලික ව්‍යුහය සහ භාවිතය තේරුම් ගැනීම
  • විදේශීය යතුර සකස් කිරීමේදී වැදගත් සලකා බැලීම් හඳුනා ගැනීම
  • ගැටලු වේගයෙන් විසඳීම සඳහා ගැටලු විසඳීමේ ක්‍රම ඉගෙන ගැනීම

2. විදේශීය යතුර යනු කුමක්ද?

විදේශීය යතුර යනු දත්ත සමුදාය තුළ වගු දෙකක් සම්බන්ධ කිරීම සඳහා භාවිතා වන වඩාත් වැදගත් සීමාවකි. එය වගුවල අතර ආශ්‍රිත සම්බන්ධතා ස්ථාපිත කර දත්ත ස්ථිරභාවය සහ අඛණ්ඩතාවය පවත්වා ගැනීමට උපකාරී වේ.

විදේශීය යතුරක මූලික නිර්වචනය

විදේශීය යතුරක් සකස් වන්නේ එක් වගුවක කොලමක් (දරු වගුව) තවත් වගුවක කොලමක් (පියා වගුව) ආශ්‍රිත කරන විටය. මෙම ආශ්‍රිතය හරහා, පහත නීති ස්වයංක්‍රීයව යෙදෙනු ඇත:

  1. දරු වගුවේ කොලම පියා වගුවේ පවතින වටිනාකම් පමණක් අඩංගු කළ හැක.
  2. පියා වගුවේ දත්ත යාවත්කාලීන කරන ලෙස හෝ මකන ලෙස කළ විට, බලපෑම දරු වගුවට ව්‍යාප්ත විය හැක (විකල්ප භාවිතා කරමින් හැසිරීම පාලනය කළ හැක).

විදේශීය යතුර සීමාවන්හි ප්‍රධාන ප්‍රතිලාභ

විදේශීය යතුර සීමාවන් භාවිතා කිරීමෙන් පහත වාසි ලැබෙනු ඇත:

  1. දත්ත අඛණ්ඩතාවය පවත්වා ගැනීම වගුවල අතර සම්බන්ධතා දැඩිව නිර්වචනය කිරීමෙන්, දත්ත නොගැලපීම් වළක්වා ගත හැක.
  2. අර්ථමුලක බර අඩු කිරීම දත්ත අඛණ්ඩතාවය දත්ත සමුදාය මට්ටමේදී කළමනාකරණය වන බැවින්, අර්ථමුලකයේ සත්‍යාපන ලොජික් අවම කළ හැක.
  3. පවත්වා ගැනීමේ හැකියාව වැඩිදියුණු කිරීම පැහැදිලි වගු සම්බන්ධතා පද්ධති නඩත්තුව සහ මෙහෙයුම් පහසු කරයි.

විදේශීය යතුර භාවිතා කරමින් උදාහරණ ව්‍යුහය

පහත දැක්වෙන්නේ විදේශීය යතුර සීමාව භාවිතා කරමින් නිශ්චිත උදාහරණ ව්‍යුහයකි.

පියා වගුව සෑදීම

CREATE TABLE departments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

දරු වගුව සෑදීම (විදේශීය යතුර සීමාව සකස් කිරීම)

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(id)
);

මෙම උදාහරණයේදී, employees වගුවේ department_id departments වගුවේ id කොලම ආශ්‍රිත කර ඇත. නිමිත්තාන්තයක් ලෙස, employees වගුවේ ලියාපදිංචි කර ඇති සෑම කෙනෙකුගේම දෙපාර්තමේන්තු තොරතුරු departments වගුවේ පවතිනු ඇත.

3. විදේශීය යතුර සීමාවන් සකස් කරන්නේ කෙසේද

විදේශීය යතුර සීමාවන් සකස් කිරීමෙන්, ඔබට වගුවල අතර ආශ්‍රිත අඛණ්ඩතාවය සහතික කළ හැක. පහතින්, MySQL හි විදේශීය යතුර සීමාවන් සකස් කිරීමේ නිශ්චිත ක්‍රම, ව්‍යාකරණය සහ උදාහරණ සමග පැහැදිලි කර ඇත.

විදේශීය යතුර සීමාවන්හි මූලික ව්‍යාකරණය

MySQL හි විදේශීය යතුර සීමාවක් සකස් කිරීමේ මූලික ව්‍යාකරණය පහත පරිදිය:

වගුවක් සෑදීමේදී විදේශීය යතුරක් සකස් කිරීම

CREATE TABLE child_table_name (
    column_name data_type,
    FOREIGN KEY (foreign_key_column_name) REFERENCES parent_table_name(parent_column_name)
    [ON DELETE option] [ON UPDATE option]
);

පවතින වගුවකට විදේශීය යතුරක් එකතු කිරීම

ALTER TABLE child_table_name
ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column_name)
REFERENCES parent_table_name(parent_column_name)
[ON DELETE option] [ON UPDATE option];

උදාහරණය: විදේශ යතුරු සීමාවක් සමඟ වගු නිර්මාණය

පහත දැක්වෙන්නේ විදේශ යතුරු සීමාවක් සමඟ පියා වගුවක් සහ දරුවා වගුවක් නිර්මාණය කිරීමේ උදාහරණයකි.

පියා වගුව නිර්මාණය කිරීම

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

දරුවා වගුව නිර්මාණය කිරීම (විදේශ යතුරු සීමාව සකස් කිරීම)

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    category_id INT,
    FOREIGN KEY (category_id) REFERENCES categories(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

ප්‍රධාන කරුණු:

  • FOREIGN KEY (category_id) REFERENCES categories(id) products වගුවේ category_id යනු categories වගුවේ id තීරුවට යොමු කරන බව අර්ථ දක්වයි.
  • ON DELETE CASCADE පියා වගුව (categories) තුළ පේළියක් මකා දැමුවහොත්, දරුවා වගුව (products) හි සම්බන්ධ දත්තද මකා දැමෙනු ඇත.
  • ON UPDATE CASCADE පියා වගුවේ පේළියක් යාවත්කාලීන කළහොත්, දරුවා වගුවේ සම්බන්ධ අගයන් ස්වයංක්‍රීයව යාවත්කාලීන වේ.

උදාහරණය: පවතින වගුවකට විදේශ යතුරු සීමාවක් එකතු කිරීම

පවතින වගුවකට විදේශ යතුරු සීමාවක් එකතු කිරීමට, පහත පියවර භාවිතා කරන්න.

උදාහරණය: විදේශ යතුරු සීමාවක් එකතු කිරීම

ALTER TABLE products
ADD CONSTRAINT fk_category
FOREIGN KEY (category_id)
REFERENCES categories(id)
ON DELETE SET NULL
ON UPDATE CASCADE;

ප්‍රධාන කරුණු:

  • fk_category යනු විදේශ යතුරු සීමාවේ නාමයයි. සීමා බහුලව ඇති විට, නාමකරණය කළමනාකරණය පහසු කරයි.
  • ON DELETE SET NULL පියා වගුවේ පේළියක් මකා දැමූ විට, products වගුවේ category_id හි අගය NULL බවට පත් වේ.

4. විදේශ යතුරු හැසිරීමේ විකල්ප

MySQL විදේශ යතුරු සීමාවලදී, පියා වගුවේ දත්ත යාවත්කාලීන හෝ මකා දැමූ විට දරුවා වගුවට කෙසේ බලපානද යන්න ඔබට පාලනය කළ හැක. මෙම පාලනය ON DELETE සහ ON UPDATE විකල්ප භාවිතයෙන් සකසයි. පහත, අපි එක් එක් විකල්පය විස්තරාත්මකව පැහැදිලි කර උදාහරණ ලබා දේ.

පොදු විකල්ප වර්ග සහ හැසිරීම

ON DELETE සහ ON UPDATE විකල්ප භාවිතයෙන් ඔබට සකස් කළ හැකි ප්‍රධාන හැසිරීම් පහත පරිදි වේ.

  1. CASCADE
  • පියා වගුවේ දත්ත මකා දැමූ හෝ යාවත්කාලීන කළ විට, සම්බන්ධ දත්ත දරුවා වගුවේ ස්වයංක්‍රීයව මකා දැමෙන හෝ යාවත්කාලීන වේ.
  1. SET NULL
  • පියා වගුවේ දත්ත මකා දැමූ හෝ යාවත්කාලීන කළ විට, දරුවා වගුවේ සම්බන්ධ විදේශ යතුරු අගය NULL වේ. දරුවා වගුවේ විදේශ යතුරු තීරුව NULL අගය ලබා දීමට ඉඩ දිය යුතුය.
  1. RESTRICT
  • දරුවා වගුවේ සමාන පේළි පවතින අතර පියා වගුවේ දත්ත මකා දැමීමට හෝ යාවත්කාලීන කිරීමට උත්සාහ කළහොත්, මෙහෙයුම ප්‍රතික්ෂේප වේ.
  1. NO ACTION
  • පියා වගුව මකා දැමූ හෝ යාවත්කාලීන කළ පසුද, දරුවා වගුවට සෘජු වෙනස්කම් නොකරයි. නමුත්, යොමුකරණ අඛණ්ඩතාව උල්ලංඝනය වුවහොත්, දෝෂයක් සිදුවේ.

එක් එක් විකල්ප භාවිතයේ උදාහරණ

1. CASCADE

පියා පේළි මකා දැමූ විට සම්බන්ධ දරුවා පේළි ස්වයංක්‍රීයව මකා දැමීමේ උදාහරණය:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT
);

CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id)
REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
  • උදාහරණය : ඔබ customers වගුවෙන් පේළියක් මකා දැමුවහොත්, orders වගුවේ සම්බන්ධ පේළි ස්වයංක්‍රීයව මකා දැමෙනු ඇත.

2. SET NULL

පියා පේළිය මකා දැමූ විට දරුවා විදේශ යතුර NULL බවට සකස් කිරීමේ උදාහරණය:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE SET NULL
    ON UPDATE CASCADE
);
  • උදාහරණය : ඔබ customers වගුවෙන් දත්ත මකා දැමුවහොත්, orders වගුවේ customer_id NULL වෙයි.

3. RESTRICT

පියමව් වගුවේ මකාදැමීම හෝ යාවත්කාලීන කිරීම සීමා කිරීමේ උදාහරණයක්:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
);
  • උදාහරණය : customers වගුවේ පේළියක් orders වගුවේ පේළි විසින් යොමු කර ඇති නම්, මකාදැමීම හෝ යාවත්කාලීන කිරීම අනුමත නොවේ.

4. NO ACTION

ආශ්‍රිත අඛණ්ඩතාවය රැකගෙන, විශේෂ ක්‍රියාවක් නොඅයදුම් කිරීමේ උදාහරණයක්:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
);
  • උදාහරණය : පියමව් දත්ත මකාදැමුවහෝ යාවත්කාලීන කළහොත්ද, ළමා වගුවට කිසිදු වෙනසක් අයදුම් නොකෙරේ. එහෙත්, ආශ්‍රිත අඛණ්ඩතාවය බිඳ වැටේ නම්, දෝෂයක් සිදුවේ.

විකල්ප තේරීම සඳහා හොඳ පුරුදු ක්‍රම

  • ව්‍යාපාර නීති මත තේරීම : ඔබේ ව්‍යාපාර ලොජික්ට හොඳින් ගැලපෙන විකල්පය තෝරන්න. උදාහරණයක් ලෙස, සම්බන්ධිත මකාදැමීම් අවශ්‍ය නම් CASCADE භාවිතා කරන්න, මකාදැමීම වැළැක්වීමට RESTRICT භාවිතා කරන්න.
  • අවධානයෙන් සැලසුම් කරන්න : CASCADE අධික ලෙස භාවිතා කිරීම අනිසි දත්ත අහිමි වීමකට හේතු විය හැක.

5. විදේශ යතුරු සීමා (Foreign Key Constraints) ගැටළු විසඳීම

MySQL හි විදේශ යතුරු සීමා සක්‍රිය කර ඇති විට, සමහර ක්‍රියාකාරකම් දෝෂ ඇති කරනු ඇත. හේතු තේරුම්ගෙන නිසි විසඳුම් යොදීමෙන්, දත්ත ගබඩා සැලසුම සහ ක්‍රියාකාරකම් සුමට පවත්වා ගත හැක. මෙම කොටස සාමාන්‍ය දෝෂ සහ ඒවා විසඳීම පිළිබඳ විස්තර කරයි.

විදේශ යතුරු සීමා සම්බන්ධ සාමාන්‍ය දෝෂ

1. දත්ත වර්ග නොගැලපීම

පියමව් සහ ළමා වගු අතර යොමු කරන තීරුවේ දත්ත වර්ග නොගැලපීමේදී මෙය සිදුවේ.

උදාහරණ දෝෂ පණිවුඩය:

ERROR 1215 (HY000): Cannot add foreign key constraint

හේතු:

  • පියමව් සහ ළමා තීරුවේ දත්ත වර්ග වෙනස් වේ (උදාහරණයක් ලෙස, පියමව් INT වන අතර ළමා VARCHAR වේ).
  • තීරුවේ ගුණාංග වෙනස් වේ (උදාහරණයක් ලෙස, UNSIGNED).

විසඳුම:

  • දෙවන වගු දෙකේම තීරුවේ දත්ත වර්ග සහ ගුණාංග එකසේ ඇති බවට සහතික වන්න.
    CREATE TABLE parent (
        id INT UNSIGNED PRIMARY KEY
    );
    
    CREATE TABLE child (
        parent_id INT UNSIGNED,
        FOREIGN KEY (parent_id) REFERENCES parent(id)
    );
    

2. යොමු කරන දත්ත නොපවතී

ඔබ ළමා පේළියක් ඇතුළත් කිරීමට උත්සාහ කරන විට, එහි විදේශ යතුරු අගය පියමව් වගුවේ නොපවතින විට මෙය සිදුවේ.

උදාහරණ දෝෂ පණිවුඩය:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

හේතුව:

  • ළමා වගුවේ විදේශ යතුරෙන් යොමු කරන අගය පියමව් වගුවේ නොපවතී.

විසඳුම:

  1. පියමව් වගුවට අවශ්‍ය පේළිය ඇතුළත් කරන්න.
    INSERT INTO parent (id) VALUES (1);
    
  1. ළමා වගුවට පේළිය ඇතුළත් කරන්න.
    INSERT INTO child (parent_id) VALUES (1);
    

3. පියමව් පේළි මකාදැමීමේදී දෝෂය

ඔබ පියමව් වගුවේ, ළමා පේළි විසින් යොමු කර ඇති පේළි මකාදැමීමට උත්සාහ කළහොත්, දෝෂයක් සිදුවිය හැක.

උදාහරණ දෝෂ පණිවුඩය:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails

හේතුව:

  • ඔබ මකාදැමීමට උත්සාහ කරන පියමව් පේළියට යොමු කරන ළමා පේළි පවතී.

විසඳුම්:

  • සුදුසු ON DELETE විකල්පයක් සකසන්න (උදාහරණයක් ලෙස, CASCADE හෝ SET NULL).
  • පියමව් පේළිය මකාදැමීමට පෙර, ළමා පේළි අතින් මකාදැමන්න.
    DELETE FROM child WHERE parent_id = 1;
    DELETE FROM parent WHERE id = 1;
    

විදේශ යතුරු සීමා ගැටළු පරීක්ෂා කිරීමේ ක්‍රම

1. විදේශ යතුරු සීමා පරීක්ෂා කිරීම

වගුවක විදේශ යතුරු සීමා තහවුරු කිරීම සඳහා පහත ප්‍රශ්නය (query) භාවිතා කරන්න.

SHOW CREATE TABLE table_name;

2. දෝෂ ලොග් පරීක්ෂා කිරීම

කලින් කාලයකදී දෝෂ ලොග් ගැටළුව පිළිබඳ විස්තර අඩංගු විය හැක. ලොග් පරීක්ෂා කිරීමට, ඔබේ MySQL වින්‍යාසයේ MySQL දෝෂ ලොග් සක්‍රිය කරන්න.

විදේශීය යතුර පරීක්ෂණ තාවකාලිකව අක්‍රිය කිරීම

විශාල ප්‍රමාණයක දත්ත ඇතුළත් කිරීමේදී හෝ මකා දැමීමේදී, විදේශීය යතුර සීමාවන් ගැටලු ඇති කළ හැක. සීමාවන් තාවකාලිකව අක්‍රිය කිරීම මෙම මෙහෙයුම් සුමටව සිදුවීමට උපකාරී වේ.

විදේශීය යතුර පරීක්ෂණ අක්‍රිය කරන්නේ කෙසේද

SET FOREIGN_KEY_CHECKS = 0;

-- Run bulk inserts or deletes
DELETE FROM parent;

SET FOREIGN_KEY_CHECKS = 1;

සටහන:
සීමාවන් අක්‍රිය කිරීමෙන් සඳහන්කරණ අඛණ්ඩතාවය බිඳ දැමිය හැකි බැවින්, මෙහෙයුම අවසන් වූ පසු ඒවා නැවත සක්‍රිය කරන්න.

6. විදේශීය යතුර හොඳම පිළිවෙත්

MySQL හි දත්ත සමුදායේ අඛණ්ඩතාවය සහතික කිරීම සඳහා විදේශීය යතුර සීමාවන් ඉතා උපකාරී වේ. නමුත්, ඒවා නිවැරදිව නිර්මාණය කර නොමැතිනම් හෝ ක්‍රියාත්මක නොකරනනම්, කාර්ය සාධනය අඩුවීම හෝ මෙහෙයුම් ගැටලු ඇති විය හැක. මෙම කොටස විදේශීය යතුර ඵලදායී ලෙස භාවිතා කිරීම සඳහා හොඳම පිළිවෙත් හඳුන්වා දෙයි.

1. විදේශීය යතුර භාවිතා කළ යුතු විට හඳුනා ගන්න

විදේශීය යතුර සීමාවන් හැම වගු සම්බන්ධතාවයකටම අනිවාර්ය නොවේ. ඒවා ක්‍රියාත්මක කිරීමට පෙර පහත දර්ශන සලකා බලන්න.

  • අනුමත දර්ශන :
  • දත්ත අඛණ්ඩතාවය වැදගත් වන විට (උදා: ඇණවුම් සහ පාරිභෝගික වගු).
  • සම්බන්ධතා නිශ්චිතව අර්ථ දක්වා ඕනෑම වෙනත් සංවර්ධකයින් හෝ කණ්ඩායම් සඳහන්කරණ නීති වැරදි වටහා නොගන්නා බවට.
  • අවම විය යුතු දර්ශන :
  • නිතිපතා විශාල පරිමාණ දත්ත ඇතුළත් කිරීම් හෝ මකා දැමීම් සිදු කරන විට (විදේශීය යතුර පරීක්ෂණ කාර්ය සාධනයට බලපෑම් කළ හැක).
  • දත්ත අඛණ්ඩතාවය සම්පූර්ණයෙන්ම යෙදුම් කේතය තුළ කළමනාකරණය වන විට.

2. සිල්ලර දත්ත වර්ග සහ ගුණාංග නිවැරදිව අර්ථ දක්වන්න

විදේශීය යතුර සීමාවන් භාවිතා කිරීමේදී, සඳහන් කරන ලද සිල්ලරවල දත්ත වර්ග සහ ගුණාංග දෙමාපිය සහ දරු වගු අතර ගැලපීම අත්‍යවශ්‍ය වේ.

අනුමත සැකසුම

  • දත්ත වර්ග ගැලපෙන බව සහතික කරන්න (උදා: දෙකම INT ).
  • ගුණාංග ගැලපෙන බව සහතික කරන්න (උදා: UNSIGNED , NOT NULL ).

නොගැලපීමේ උදාහරණය සහ නිවැරදි කිරීම

-- Before Fix
CREATE TABLE parent (
    id INT PRIMARY KEY
);

CREATE TABLE child (
    parent_id INT UNSIGNED,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);
-- After Fix
CREATE TABLE parent (
    id INT UNSIGNED PRIMARY KEY
);

CREATE TABLE child (
    parent_id INT UNSIGNED,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);

3. නිසි ගබඩා එන්ජින් තෝරන්න

MySQL හි, විදේශීය යතුර සීමාවන් සහාය දක්වන ගබඩා එන්ජින් භාවිතා කළ යුතුය.

  • අනුමත එන්ජින් : InnoDB
  • වැදගත් සටහන : MyISAM වැනි ගබඩා එන්ජින් විදේශීය යතුර සීමාවන් සහාය නොදක්වයි.
    CREATE TABLE example_table (
        id INT PRIMARY KEY
    ) ENGINE=InnoDB;
    

4. විදේශීය යතුර විකල්ප සැලකිල්ලෙන් තෝරන්න

විදේශීය යතුර සීමාවන් සැකසීමේදී, ON DELETE සහ ON UPDATE විකල්ප නිවැරදිව තෝරා ගැනීම අනපේක්ෂිත දත්ත මකා දැමීම් හෝ යාවත්කාලීන කිරීම් වැළැක්වීමට උපකාරී වේ.

අනුමත විකල්ප උදාහරණ

  • සම්බන්ධිත මකා දැමීම අවශ්‍ය වන විට : ON DELETE CASCADE
  • සඳහන්කරණ සුරැකීමට අවශ්‍ය වන විට : ON DELETE SET NULL
  • අනපේක්ෂිත මෙහෙයුම් වැළැක්වීමට අවශ්‍ය වන විට : ON DELETE RESTRICT
    FOREIGN KEY (category_id) REFERENCES categories(id)
    ON DELETE CASCADE ON UPDATE CASCADE;
    

5. විදේශීය යතුර සීමාවන් ඉවත් කිරීමේදී පරිස්සම් වන්න

විදේශීය යතුර සීමාවක් තවදුරටත් අවශ්‍ය නොවන්නේ නම්, එය ඉවත් කළ හැක. නමුත්, සීමාවන් ඉවත් කිරීම දත්ත අඛණ්ඩතාවයට බලපායි, එබැවින් සැලකිල්ලෙන් ක්‍රියා කරන්න.

උදාහරණය: විදේශීය යතුර සීමාවක් ඉවත් කිරීම

ALTER TABLE child_table
DROP FOREIGN KEY fk_name;

6. කාර්ය සාධනය ඉග්‍රේඩ් කිරීම

විදේශීය යතුර සීමාවන් සඳහන්කරණ අඛණ්ඩතාවය සහතික කරයි නමුත් ඇතුළත් කිරීම් සහ මකා දැමීම් මෙහෙයුම් අතර අමතර බරක් හඳුන්වා දෙයි. ඉග්‍රේඩ් කිරීම සඳහා පහත උපාය මාර්ග සලකා බලන්න.

සුචි භාවිතා කිරීම

විදේශීය යතුර සිල්ලර මත සුචි සාදන්න ප්‍රශ්න කාර්ය සාධනය වැඩි දියුණු කිරීම සඳහා. MySQL විදේශීය යතුර සීමාවන් අර්ථ දක්වන විට සුචි ස්වයංක්‍රීයව සාදයි, නමුත් ඒවා যාවත්කාලීන කිරීම හොඳ පිළිවෙතකි.

බහු මෙහෙයුම් අතරතුර සීමාවන් අක්‍රිය කිරීම

විශාල දත්ත ඇතුළත් කිරීම් හෝ මකා දැමීම් සිදු කරන විට, විදේශීය යතුර සීමාවන් තාවකාලිකව අක්‍රිය කිරීම අනුමත වේ.

SET FOREIGN_KEY_CHECKS = 0;
-- Perform bulk data operations
SET FOREIGN_KEY_CHECKS = 1;

7. ලේඛනකරණය සහ කණ්ඩායම් සන්නිවේදනය

විදේශීය යතුරු සීමා ක්‍රියාත්මක කරන විට, කණ්ඩායමේ අභ්‍යන්තරයේ නිර්මාණ අරමුණ සහ හේතු බෙදා ගැනීම වැදගත් වේ. සංකීර්ණ සම්බන්ධතා සඳහා, ER රූප (Entity-Relationship රූප) භාවිතා කිරීම ඉතාමත් නිර්දේශිතය.

7. FAQ (නිතර අසන ප්‍රශ්න)

MySQL විදේශීය යතුරු (foreign keys) පිළිබඳ සාමාන්‍ය ප්‍රශ්න සහ පිළිතුරු මෙහි ඇත. මෙම කොටස ආරම්භක මට්ටමේ ගැටළු සිට ප්‍රායෝගික මෙහෙයුම් ගැටළු දක්වා විවිධ මාතෘකා ආවරණය කරයි.

Q1. විදේශීය යතුරු සීමා සකස් කිරීමේ ප්‍රතිලාභ මොනවාද?

A1.
විදේශීය යතුරු සීමා සකස් කිරීම පහත ප්‍රතිලාභ ලබා දේ:

  • දත්ත අඛණ්ඩතාවය සහතික කරයි : යොමු කරන දත්ත නොමැති විට ඇතුළත් කිරීම හෝ යාවත්කාලීන කිරීම වැළැක්වයි.
  • දත්ත ගබඩා නිර්මාණය පැහැදිලි කරයි : වගු අතර සම්බන්ධතා තේරුම් ගැනීමට පහසු කරයි.
  • යෙදුම් කේත සංකීර්ණතාවය අඩු කරයි : අඛණ්ඩතා පරීක්ෂණයන් දත්ත ගබඩාව විසින් ස්වයංක්‍රීයව කළමනාකරණය කරයි.

Q2. විදේශීය යතුරු සීමා කාර්ය සාධනයට බලපාද?

A2.
ඔව්, විදේශීය යතුරු අඛණ්ඩතා පරීක්ෂණයන් INSERT, UPDATE, DELETE මෙහෙයුම් අතර අතිරේක පූර්ණභාරයක් ගෙන එයි. එහෙත්, ඔබට බලපෑම අඩු කිරීමට පහත ක්‍රම භාවිතා කළ හැක:

  • විදේශීය යතුරු තීරුවල ඉන්ඩෙක්සස් (indexes) සෑදීම.
  • විශාල මෙහෙයුම් අතර තාවකාලිකව සීමා අක්‍රිය කිරීම.
  • අවශ්‍ය විට පමණක් විදේශීය යතුරු භාවිතා කිරීම.

Q3. සියලුම ගබඩා එන්ජින් (storage engines) විදේශීය යතුරු සීමා සහය දක්වයිද?

A3.
නැත. MySQL හි, විදේශීය යතුරු සීමා ප්‍රධාන වශයෙන් InnoDB ගබඩා එන්ජින් විසින් සහය දක්වයි. අනෙකුත් එන්ජින් (උදා: MyISAM) විදේශීය යතුරු සීමා සහය නොදක්වයි. වගු සෑදීමේදී InnoDB නියම කරන්න:

CREATE TABLE table_name (
    id INT PRIMARY KEY
) ENGINE=InnoDB;

Q4. මව් (parent) සහ ළමා (child) වගු තීරුවල දත්ත වර්ග (data types) ගැලපිය යුතුද?

A4.
ඔව්. මව් සහ ළමා වගු වල සම්බන්ධිත තීරුවල දත්ත වර්ග සහ ගුණාංග (උදා: UNSIGNED, NOT NULL) එකම විය යුතුය. එසේ නොමැති නම්, විදේශීය යතුරු සීමාව සකස් කිරීමේදී දෝෂයක් සිදුවේ.

Q5. විදේශීය යතුරු සීමා දෝෂයන් හඳුනා ගැනීමට මොනවා කළ හැකිද?

A5.
විදේශීය යතුරු සීමා දෝෂයක් සිදුවේ නම්, පහත කරුණු පරීක්ෂා කරන්න:

  1. දත්ත වර්ග සමගිත්වය : මව් සහ ළමා වගු අතර තීරුවල වර්ග එකම බව තහවුරු කරන්න.
  2. මව් දත්ත පවතින බව : යොමු කරන දත්ත මව් වගුවේ පවතින බව තහවුරු කරන්න.
  3. ගබඩා එන්ජින් : දෙවන වගුද InnoDB භාවිතා කරන බව තහවුරු කරන්න.
  4. විදේශීය යතුරු වලංගුකරණය : මෙහෙයුම් පරීක්ෂා කිරීම සඳහා තාවකාලිකව විදේශීය යතුරු පරීක්ෂණ අක්‍රිය කරන්න:
    SET FOREIGN_KEY_CHECKS = 0;
    

Q6. විදේශීය යතුරු සීමා ඉවත් නොකර තාවකාලිකව අක්‍රිය කළ හැකිද?

A6.
ඔව්. පහත SQL විධාන භාවිතා කර විදේශීය යතුරු සීමා තාවකාලිකව අක්‍රිය කළ හැක:

SET FOREIGN_KEY_CHECKS = 0;
-- Perform necessary operations
SET FOREIGN_KEY_CHECKS = 1;

මෙම ක්‍රමය විශාල දත්ත මෙහෙයුම් සඳහා ප්‍රයෝජනවත් වන නමුත්, සම්බන්ධතා අඛණ්ඩතාවය බිඳ වැටීමෙන් වැළැක්වීමට අවධානයෙන් භාවිතා කළ යුතුය.

Q7. මව් වගුවේ විශාල මකාදැමීම් (deletions) කෙසේ කළ යුතුද?

A7.
පහත පියවර අනුගමනය කරන්න:

  1. විදේශීය යතුරු සීමා තාවකාලිකව අක්‍රිය කරන්න.
    SET FOREIGN_KEY_CHECKS = 0;
    
  1. අවශ්‍ය මකාදැමීම ක්‍රියාත්මක කරන්න.
    DELETE FROM parent_table;
    
  1. විදේශීය යතුරු සීමා නැවත සක්‍රිය කරන්න.
    SET FOREIGN_KEY_CHECKS = 1;
    

Q8. විදේශීය යතුරු සීමාවක් ඉවත් කිරීම කෙසේද?

A8.
විදේශීය යතුරු සීමාව ඉවත් කිරීම සඳහා පහත විධානය භාවිතා කරන්න:

ALTER TABLE child_table
DROP FOREIGN KEY fk_name;

විදේශීය යතුරු නාමය (fk_name) SHOW CREATE TABLE table_name; භාවිතා කර තහවුරු කළ හැක.

8. සාරාංශය

මෙම ලිපියේ, අපි MySQL විදේශීය යතුරු සීමා මූලික සංකල්පයන් සිට වින්‍යාස ක්‍රම, ගැටළු හඳුනා ගැනීමේ තාක්ෂණ, හොඳ පුරුදු, සහ FAQ දක්වා ආවරණය කළෙමු. පහත ප්‍රධාන කරුණු සාරාංශයක් වේ.

විදේශීය යතුරු සීමා මූලික කරුණු

  • විදේශීය යතුරු සීමා වගු අතර සම්බන්ධතා නිර්වචනය කරයි සහ සන්දර්භ අඛණ්ඩතාවය (referential integrity) සහතික කරයි.
  • ඒවා ප්‍රධාන වශයෙන් මව්‑දරුවන් (parent‑child) සම්බන්ධතා කළමනාකරණය කිරීම සහ දත්ත සමගිත්වය (data consistency) රැක ගැනීමට භාවිතා වේ.

වින්‍යාසය සහ මෙහෙයුම

  • වගුවක් නිර්මාණය කරන විට විදේශීය යතුරු සීමා සකස් කළ හැකි අතර පවතින වගුවකටද එකතු කළ හැක.
  • ON DELETE සහ ON UPDATE විකල්පයන් මව් වගුවේ මෙහෙයුම් සඳහා සවිස්තරාත්මක පාලනය ලබා දෙයි.
  • විදේශීය යතුරු වින්‍යාස කරන විට ගැලපෙන දත්ත වර්ග සහ InnoDB ගබඩා එන්ජින් කාරුණිකව තෝරන්න.

සාමාන්‍ය ගැටළු සහ විසඳුම්

  • දත්ත වර්ග නොගැලපීම හෝ මව් දත්ත අස්ථානගත වීම වැනි සාමාන්‍ය දෝෂයන් කාරුණික නිර්මාණය සහ නිසි වින්‍යාසය මඟින් වැළැක්විය හැක.
  • සීමා ගැටළුවක් වුවහොත්, තාවකාලිකව ඒවා අක්‍රිය කිරීම මෙහෙයුම් කාර්යක්ෂමතාව වැඩි කරයි.

හොඳ පුරුදු ක්‍රම

  • අවශ්‍ය වන විට පමණක් විදේශීය යතුරු සීමා භාවිතා කර අධික වින්‍යාසය වලක්වන්න.
  • සුදුසු ON DELETE / ON UPDATE විකල්ප තෝරා ගැනීම සහ ඉන්ඩෙක්ස් භාවිතයෙන් කාර්යක්ෂමතාව උපරිම කරගන්න.
  • කණ්ඩායමේ අභ්‍යන්තරයේ විදේශීය යතුරු නිර්මාණ අදහස් බෙදා ගන්න සහ ලේඛනය කරන්න.

ඊළඟ පියවරයන්

මෙම ලිපිය මත පදනම්ව, පහත පියවර ගැනීමට සලකා බලන්න:

  1. පරීක්ෂණ දත්ත ගබඩාවක් සාදන්න සහ විදේශීය යතුරු සීමා සමඟ පරීක්ෂා කර ඒවායේ හැසිරීම නිරීක්ෂණය කරන්න.
  2. විශාල දත්ත කට්ටලයන් සමඟ පරිසරවල කාර්යක්ෂමතාව මැනගන්න සහ අවශ්‍ය පරිදි සැකසුම් සකස් කරන්න.
  3. දත්ත අඛණ්ඩතාවය සහතික කරන පද්ධති නිර්මාණය සඳහා සැබෑ ව්‍යාපෘතිවල විදේශීය යතුරු සීමා යොදන්න.

විදේශීය යතුරු සීමා නිවැරදිව භාවිත කිරීම දත්ත ගබඩා නිර්මාණය ශක්තිමත් කරයි සහ දිගුකාලීන මෙහෙයුම් කාර්යක්ෂමතාව වැඩි කරයි. ඔබේ ව්‍යාපෘතිවල MySQL උපරිම ලෙස භාවිතා කිරීමට මෙම මාර්ගෝපදේශය උපකාරී වේ කියා අපි බලාපොරොත්තු වෙමු.