Wednesday, February 4, 2009

எளிய தமிழில் SQL - பாகம் 13

Primary key மற்றும் Foreign key ஆகியவற்றைப் பற்றியும், SQL வாயிலாக இரண்டு Tableகளை இணைப்பது எப்படி என்றும் இன்றைக்குப் பார்ப்போம்.

Primary key என்பது ஒரு Tableல் இருக்கும் அனைத்து Row களையும் தனித்தனியாகக் கண்டறிய உதவுகிறது. உதாரணமாக ஒரு எளிய Table. அதில் 2 Columns மட்டும். அவை DirectorID int, DirectorName varchar(50)
(மேலும் இது Primary keyஆகவும், Autoincrement ஆகவும் கொடுக்கப்படுகிறது. Auto increment என்பது int எனப்படும் எண்களுக்கு மட்டுமே சாத்தியப்படும்) , இந்த Tableக்கு DirectorInfo எனப் பெயரிடுவோம்.


இந்த DirectorID எனப்படும் Column ஐ Primary key ஆக மாற்ற என்ன செய்யவேண்டும்.

DirectorID எனப்படும் Column ஐத் தேர்வு செய்து Right Click செய்து, தோன்றக்கூடிய சிறு menuவில் Set Primary Key என்பதைச் சொடுக்கவும்.
இதைச் செய்தபிறகு DirectorID க்கு இடது புறம் ஒரு சிறிய சாவியின் படம் தெரிய ஆரம்பிக்கும்.

மேலும் Identity Column ( Auto increment) ஆக மாற்றுவதற்கு என்ன செய்வது?
DirectorID எனப்படும் Column ஐத் தேர்வு செய்து F4 என்னும் Function keyஐ அழுத்தினால் Properties Windows ஐக் காணலாம். அதில் Table Designer என்னும் தலைப்பின் கீழே, Identity Column என்பதற்கு நேராக உள்ள Drop Downlist ல் DirectorID என்பதைத் தேர்வு செய்யவும்.
அல்லது கீழ்க்கண்ட செயல்முறையைத் தொடரலாம். Identity Column ஆக மாற்ற கீழ்க்கண்ட படத்தில் உள்ளபடி செய்யலாம். அந்த Column ஐத் தேர்வுசெய்தபிறகு, கீழே உள்ள Column Properties Tab ல் , Identity Specification ஐ Yes எனக் கொடுக்கவும்.
அதன் Increment , seed மதிப்புகளைக் கொடுக்கலாம். அல்லது 1 எனவே விட்டுவிடலாம். ஒவ்வொரு rowன் மதிப்பும் ஐந்து, ஐந்தாக அதிகரிக்கவேண்டும் எனில் Identity Increment ன் மதிப்பை 5 எனக் கொடுக்கவும்.

சரி ஒருவழியாக DirectorsInfo வின் Structure ஐ உருவாக்கிவிட்டோம். இப்போது இதை Close செய்துவிடவும்.

இப்போது மேலும் ஒரு எளிய Table ஒன்றை உருவாக்கி, அதற்கு FilmInfo எனப் பெயரிடுவோம்.
இந்த FilmInfo என்கிற புதிய Tableல் DirectorID என்னும் Column உள்ளது. இது int எனப்படும் எண் வகையைச் சேர்ந்த Data Type.

ஒவ்வொரு படத்தையும் வேறு வேறு இயக்குநர்கள் இயக்கியிருக்கலாம். ஒன்றுக்கு மேற்பட்ட திரைப்படங்களை ஒரே இயக்குநரே இயக்கியிருக்கலாம்.

1000 திரைப்படங்களின் தகவல்களைச் சேகரித்தோம் எனில், அதில் ஒரே இயக்குநரானவர் 10 அல்லது 25 அல்லது 100 படங்களைக்கூட எடுத்திருப்பார். 100 முறை அவரது பெயரை எழுதினால் நினைவகம் (memory) தேவையில்லாமல் ஆக்கிரமிக்கப்படும். அதனால் அவரது பெயரை ஒரே ஒருமுறை மட்டும் Master Table ல் (இங்கே DirectorsInfo - என்பதே Master table) கொடுத்து அவருக்காக ஒரு எண்ணை ஒதுக்கி விடுகிறோம்.

பலவித திரைப்படங்களின் தகவல்களை இரண்டாவது Table (FilmInfo என்பது இங்கே Detail Table)ல் பதிவுசெய்யப் போகிறோம். இங்கே ஒவ்வொரு Directorன் பெயரை முழுவதும் எழுதி நினைவகத்தை ஆக்கிரமிக்காமல் அவருக்குரிய எண்ணை மட்டும் கொடுப்போம்.

Master Table ல் ஒவ்வொரு Director க்கும் எண்களும், பெயர்களும் கொடுத்துவிட்டு, Detail Tableல் Directorக்கு உரிய எண்ணை மட்டும் கொடுப்பது வழக்கம்.

நினைவக இழப்பைக் குறைப்பதற்காகவும், ஒரே தகவலை திரும்பத்திரும்ப எழுதுவதைத் தவிர்க்கவும் - இந்த ஏற்பாடு.

ஒரு Director ஆனவர் பல படங்களை எடுத்துள்ளார் - எனில் இதை ONE TO MANY RELATIONSHIP என்போம்.

இந்த இரண்டாவது Tableன் Structureஐ ஏற்றிமுடித்ததும் கீழ்க்கண்ட செயல்முறையைச் செய்து இரண்டு Tableகளுக்கும் ஒரு உறவுமுறையை உண்டாக்கவும். உறவுமுறை (Table Relationship).
Test எனப்படும் Databaseல் Database Diagrams என்பதைத் தேர்வுசெய்து, Right Click செய்து, அதில் New Database Diagram ஐத் தேர்ந்தெடுக்கவும்.


உடன் தெரியும் உரையாடல் பெட்டியில் (dialog box) , DirectorsInfo மற்றும், FilmInfo ஆகிய இரண்டு Tableகளையும் தேர்வு செய்து , Add ஐ அழுத்தியபிறகு, Close அழுத்தவும்.இப்போது திரை கீழ்க்கண்டவாறு காட்சியளிக்கும்.

DirectorsInfo ல் இருக்கும் DirectorID ஐ அப்படியே இழுத்துக்கொண்டு வந்து, FilmInfo வில் இருக்கும் DirectorIDல் விடவும். அதாவது Master Tableன் DirectorID ஐ Drag செய்து, Detail Table ல் இருக்கும் DirectorIDல் Drop செய்யவும்.

எளிதான Drag and Drop தான்.

இப்போது திரையில் மேற்கண்ட படம் தெரியும். Primary key Table (Director Info).
Foreign Key Table (FilmInfo). இரண்டுமே DirectorID என்னும் Column ஆகவும், ஒரே DataTypeஆகவும் இருக்கிறது. பிறகு இரண்டு முறை OK கொடுக்கவும்.

இப்போது திரையில் கீழ்க்கண்ட படத்தைக் காணலாம். இந்த Database Diagram ஐ Close செய்துவிட்டு, Tableக்குரிய தகவல்களை ஒவ்வொரு Row ஆக ஏற்றவும்.

DirectorsInfo வில் முதலில் உங்களுக்குத் தெரிந்த Directorsன் பெயர்களை மட்டும் கொடுத்தால் போதும். DirectorID என்பது அதுவாகவே உருவாகிக்கொள்ளும். அடுத்தடுத்த Directorகளுக்குரிய எண்கள் தானாகவே அமைந்துகொள்ளும். இதற்கு காரணம் அந்த குறிப்பிட்ட Column ஆனது IDENTITY Column என அமைக்கப்பட்டுள்ளதே.

பிறகு ஒவ்வொரு படங்களுக்கும் உரிய தகவல்களை Row by Row வாக FilmInfo என்னும் Tableல் ஏற்றவும். இங்கே DirectorIDஎன்னும் Columnல் ஏற்கனவே Master Tableல் என்ன எண்கள் அளிக்கப்பட்டிருக்கிறதோ அவற்றை மாத்திரமே கொடுக்கவேண்டும். Master Tableல் இல்லாத DirectorID ஐக் கொடுத்தால் பிழைச்செய்தி காண்பிக்கும்.
உதாரணத்திற்காக DirectorInfoவில் சில records உங்கள் பார்வைக்கு.

FilmInfo எனப்படும் Detail Tableல் நான் ஏற்றிய சில Records கீழே.
இதில் Master Table ல் என்ன DirectorID கொடுத்தோமோ அதை Detail Tableல் refer செய்கிறோம். ஒவ்வொரு படத்துக்கும் அதை இயக்கிய இயக்குநரின் பெயரைக் கொடுக்காமல், அவருக்குரிய ID எனப்படும் எண்ணை மட்டும் கொடுக்கிறோம்.

இரண்டு Tableஐயும் இணைத்து JOIN செய்வதற்கு உரிய செயல்முறை கீழே:

T-SQL Editorல் Right Click செய்து, Design Query in Editor என்பதைத் தேர்வு செய்யவும்.

பிறகு வரும் Dialog boxல் இரண்டு Tablesஐயும் தேர்வு செய்து Add கொடுத்தபின் Close செய்யவும்.
ஏற்கனவே Primary key, மற்றும் Foreign key ஆகியவை முறைப்படி இணைக்கப்பட்டிருந்தால் கீழ்க்கண்ட படம் திரையில் காட்சியளிக்கும்.
இரண்டு Tableகளிலிருந்து எந்தெந்த Columnsஐ நாம் தேர்ந்தெடுக்கிறோம் என்பதை ஒவ்வொரு Columnக்கும் எதிரேயுள்ள Checkbox ல் Tick செய்துவிடுங்கள்.
இப்படி Columnகளைத் தேர்வுசெய்தவுடன் உங்களுக்குக் கீழ்க்கண்ட Query கிடைக்கும்

SELECT DirectorsInfo.DirectorName, FilmInfo.FilmName, FilmInfo.Actor, FilmInfo.Actress
FROM DirectorsInfo INNER JOIN
FilmInfo ON DirectorsInfo.DirectorID = FilmInfo.DirectorID
பின் OK அழுத்தினால் மேலேயுள்ள Query ஆனது T-SQL Editorக்கு வந்துவிடும்.

F5 அழுத்தின் இயக்கவும். இதன் மூலம் இரண்டு Tableன் தகவல்களும் ஒரே திரையில் காண்பிக்கப்படும்.

3 comments:

ரவி said...

kalakkal

Tech Shankar said...

நன்றி : திரு.. செந்தழல் ரவி அவர்களே

வடுவூர் குமார் said...

நன்றாக புரிகிற மாதிரி சொல்லியுள்ளீர்கள்.

எளிய தமிழில் SQL - பாகம் 17

பாகம் 15ல் திரு G. ராஜாராமன், சவுதி அரேபியா அவர்கள் கீழ்க்கண்ட கேள்வியை எழுப்பி இருந்தார். அவருக்கு விடையளிக்கும் விதமாக இந்தப்பதிவு அமைகிற...