בדף הזה מוסבר איך להעביר מפתחות ראשיים מטבלאות של מסד נתונים של מקור לטבלאות של מסד נתונים של Spanner GoogleSQL-dialect ושל מסד נתונים של PostgreSQL-dialect. לפני שמבצעים את הפעולות שמתוארות בדף, כדאי לעיין בסקירה הכללית של העברת מפתח ראשי.
אם במסד הנתונים של המקור יש טבלאות ללא מפתחות ראשיים שהוגדרו על ידי המשתמש, אפשר להעביר את הטבלאות האלה ל-Spanner בלי להגדיר מפתחות ראשיים חדשים. מידע נוסף זמין במאמר יצירת טבלה בלי להגדיר מפתח ראשי.
לפני שמתחילים
-
כדי לקבל את ההרשאות שנדרשות להעברת מפתחות ראשיים ל-Spanner, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM אדמין של מסד נתונים ב-Cloud Spanner (
roles/spanner.databaseAdmin) במופע.
העברת מפתחות רציפים שנוצרו אוטומטית
אם אתם מעבירים נתונים ממסד נתונים שמשתמש במפתחות מונוטוניים רציפים, כמו AUTO_INCREMENT ב-MySQL, SERIAL ב-PostgreSQL או הסוג IDENTITY הרגיל בשרת SQL או ב-Oracle, כדאי לשקול את אסטרטגיית ההעברה הבאה ברמה גבוהה:
- ב-Spanner, משכפלים את מבנה הטבלה ממסד הנתונים של המקור באמצעות מפתח ראשי מסוג מספר שלם.
- לכל עמודה ב-Spanner שמכילה ערכים עוקבים, יוצרים רצף ומקצים את הפונקציה
GET_NEXT_SEQUENCE_VALUE( GoogleSQL, PostgreSQL) כערך ברירת המחדל של העמודה. - העברת נתונים קיימים עם מפתחות מקוריים ממסד הנתונים של המקור אל Spanner. אפשר להשתמש בכלי להעברת נתונים ל-Spanner או ב
תבנית Dataflow.
- אפשר גם להגדיר אילוצי מפתח זר לכל הטבלאות התלויות.
- לפני שמוסיפים נתונים חדשים, צריך לשנות את רצף Spanner כדי לדלג על טווח ערכי המפתח הקיימים.
- להוסיף נתונים חדשים, ולאפשר לרצף ליצור מפתחות ייחודיים באופן אוטומטי.
דוגמה לתהליך עבודה של העברה
הקוד הבא מגדיר את מבנה הטבלה ואת הרצף שקשור אליה ב-Spanner באמצעות אובייקט SEQUENCE, ומגדיר את האובייקט כערך הראשי שמוגדר כברירת מחדל בטבלת היעד:
GoogleSQL
CREATE SEQUENCE singer_id_sequence OPTIONS ( SequenceKind = 'bit_reversed_positive' ); CREATE TABLE Singers ( SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE SingerIdSequence)), Name STRING(1024), Biography STRING(MAX), ) PRIMARY KEY (SingerId); CREATE TABLE Albums ( AlbumId INT64, SingerId INT64, AlbumName STRING(1024), SongList STRING(MAX), CONSTRAINT FK_singer_album FOREIGN KEY (SingerId) REFERENCES Singers (SingerId) ) PRIMARY KEY (AlbumId);
PostgreSQL
CREATE SEQUENCE SingerIdSequence BIT_REVERSED_POSITIVE; CREATE TABLE Singers ( SingerId BIGINT DEFAULT nextval('SingerIdSequence') PRIMARY KEY, Name VARCHAR(1024) NOT NULL, Biography TEXT ); CREATE TABLE Albums ( AlbumId BIGINT PRIMARY KEY, SingerId BIGINT, AlbumName VARCHAR(1024), SongList TEXT, CONSTRAINT FK_singer_album FOREIGN KEY (SingerId) REFERENCES Singers (SingerId) );
האפשרות bit_reversed_positive מציינת שהערכים שנוצרו על ידי הרצף הם מסוג INT64, גדולים מאפס ולא עוקבים.
כשמעבירים שורות קיימות ממסד הנתונים של המקור אל Spanner, המפתחות הראשיים נשארים ללא שינוי.
כשמוסיפים רשומות חדשות שלא מצוין בהן מפתח ראשי, מערכת Spanner מאחזרת באופן אוטומטי ערך חדש על ידי קריאה לפונקציה GET_NEXT_SEQUENCE_VALUE(GoogleSQL או PostgreSQL).
הערכים האלה מפוזרים באופן אחיד בטווח [1, 263] ויכול להיות שיהיו התנגשויות עם המפתחות הקיימים. כדי למנוע את זה, אפשר להגדיר את הרצף באמצעות ALTER_SEQUENCE
(GoogleSQL
או PostgreSQL)
כדי לדלג על טווח הערכים שמכוסה על ידי המפתחות הקיימים.
נניח שהטבלה singers הועברה מ-PostgreSQL, ושמפתח ראשי singer_id שלה הוא מסוג SERIAL. הקוד הבא של PostgreSQL
מציג את ה-DDL של מסד הנתונים של המקור:
PostgreSQL
CREATE TABLE Singers ( SingerId SERIAL PRIMARY KEY, Name varchar(1024), Biography varchar );
הערכים של המפתח הראשי גדלים באופן מונוטוני. אחרי ההעברה, אפשר לאחזר את הערך המקסימלי של המפתח הראשי singer_id ב-Spanner. משתמשים בקוד הבא ב-Spanner:
GoogleSQL
SELECT MAX(SingerId) FROM