Δημιουργία μοναδικών αναγνωριστικών σε έναν πίνακα αποθήκης στο Microsoft Fabric
Ισχύει για:✅ Warehouse στο Microsoft Fabric
Είναι συνηθισμένη απαίτηση στις αποθήκες δεδομένων να εκχωρείτε ένα μοναδικό αναγνωριστικό σε κάθε γραμμή ενός πίνακα. Σε περιβάλλοντα που βασίζονται σε SQL Server, αυτό συνήθως γίνεται με τη δημιουργία μιας στήλης ταυτότητας σε έναν πίνακα, ωστόσο, προς το παρόν αυτή η δυνατότητα δεν υποστηρίζεται σε μια αποθήκη στο Microsoft Fabric. Αντίθετα, πρέπει να χρησιμοποιήσετε μια τεχνική λύσης. Παρουσιάζουμε δύο εναλλακτικές.
Αυτό το άρθρο περιγράφει τεχνικές λύσης για τη δημιουργία μοναδικών αναγνωριστικών σε έναν πίνακα αποθήκης.
Μέθοδος 1
Αυτή η μέθοδος ισχύει περισσότερο όταν χρειάζεται να δημιουργήσετε τιμές ταυτότητας, αλλά η σειρά των τιμών δεν είναι σημαντική (οι μη έγκυρες τιμές είναι αποδεκτές).
Οι μοναδικές τιμές δημιουργούνται στον κώδικα που εισάγει δεδομένα στον πίνακα.
Για να δημιουργήσετε μοναδικά δεδομένα χρησιμοποιώντας αυτή τη μέθοδο, δημιουργήστε έναν πίνακα που περιλαμβάνει μια στήλη που αποθηκεύει μοναδικές τιμές αναγνωριστικού. Ο τύπος δεδομένων στήλης πρέπει να οριστεί σε bigint. Θα πρέπει επίσης να ορίσετε τη στήλη ώστε
NOT NULL
να εξασφαλίσετε ότι σε κάθε γραμμή εκχωρείται ένα αναγνωριστικό.Το ακόλουθο δείγμα κώδικα T-SQL δημιουργεί ένα παράδειγμα πίνακα με ονομασία
Orders_with_Identifier
στοdbo
σχήμα, όπου ηRow_ID
στήλη χρησιμεύει ως μοναδικό κλειδί.--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL DROP TABLE [dbo].[Orders_with_Identifier]; GO CREATE TABLE [dbo].[Orders_with_Identifier] ( [Row_ID] BIGINT NOT NULL, [O_OrderKey] BIGINT NULL, [O_CustomerKey] BIGINT NULL, [O_OrderStatus] VARCHAR(1) NULL, [O_TotalPrice] DECIMAL(15, 2) NULL, [O_OrderDate] DATE NULL, [O_OrderPriority] VARCHAR(15) NULL, [O_Clerk] VARCHAR (15) NULL, [O_ShipPriority] INT NULL, [O_Comment] VARCHAR (79) NULL );
Όταν εισάγετε γραμμές στον πίνακα, μέσω δεσμών ενεργειών T-SQL ή κώδικα εφαρμογής ή με άλλον τρόπο, δημιουργείτε μοναδικά δεδομένα για
Row_ID
τηNEWID()
συνάρτηση. Αυτή η συνάρτηση δημιουργεί μια μοναδική τιμή τύπου μοναδικού αναγνωριστικού, η οποία μπορεί, στη συνέχεια, να μετατεθεί και να αποθηκευτεί ως μεγάλη τιμή.Ο ακόλουθος κώδικας εισάγει γραμμές στον
dbo.Orders_with_Identifier
πίνακα. Οι τιμές για τηRow_ID
στήλη υπολογίζονται μετατρέποντας τις τιμές που επιστρέφονται από τηnewid()
συνάρτηση. Η συνάρτηση δεν απαιτεί ένανORDER BY
όρο και δημιουργεί μια νέα τιμή για κάθε εγγραφή.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT CONVERT(BIGINT, CONVERT(VARBINARY, CONCAT(NEWID(), GETDATE()))) AS [Row_ID], [src].[O_OrderKey], [src].[O_CustomerKey], [src].[O_OrderStatus], [src].[O_TotalPrice], [src].[O_OrderDate], [src].[O_OrderPriority], [src].[O_Clerk], [src].[O_ShipPriority], [src].[O_Comment] FROM [dbo].[Orders] AS [src];
Μέθοδος 2
Αυτή η μέθοδος εφαρμόζεται περισσότερο όταν χρειάζεται να δημιουργήσετε διαδοχικές τιμές ταυτότητας, αλλά θα πρέπει να χρησιμοποιείται προσεκτικά σε μεγαλύτερα σύνολα δεδομένων, καθώς μπορεί να είναι πιο αργή από τις εναλλακτικές μεθόδους. Θα πρέπει επίσης να ληφθούν υπόψη οι πολλαπλές διαδικασίες εισαγωγής δεδομένων ταυτόχρονα, καθώς αυτό μπορεί να οδηγήσει σε διπλότυπες τιμές.
Για να δημιουργήσετε μοναδικά δεδομένα χρησιμοποιώντας αυτή τη μέθοδο, δημιουργήστε έναν πίνακα που περιλαμβάνει μια στήλη που αποθηκεύει μοναδικές τιμές αναγνωριστικού. Ο τύπος δεδομένων στήλης πρέπει να οριστεί σε ενσωματωμένο ή μεγάλο μέγεθος, ανάλογα με τον όγκο των δεδομένων που περιμένετε να αποθηκεύσετε. Θα πρέπει επίσης να ορίσετε τη στήλη ώστε
NOT NULL
να εξασφαλίσετε ότι σε κάθε γραμμή εκχωρείται ένα αναγνωριστικό.Το ακόλουθο δείγμα κώδικα T-SQL δημιουργεί ένα παράδειγμα πίνακα με ονομασία
Orders_with_Identifier
στοdbo
σχήμα, όπου ηRow_ID
στήλη χρησιμεύει ως μοναδικό κλειδί.--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL DROP TABLE [dbo].[Orders_with_Identifier]; GO CREATE TABLE [dbo].[Orders_with_Identifier] ( [Row_ID] BIGINT NOT NULL, [O_OrderKey] BIGINT NULL, [O_CustomerKey] BIGINT NULL, [O_OrderStatus] VARCHAR(1) NULL, [O_TotalPrice] DECIMAL(15, 2) NULL, [O_OrderDate] DATE NULL, [O_OrderPriority] VARCHAR(15) NULL, [O_Clerk] VARCHAR (15) NULL, [O_ShipPriority] INT NULL, [O_Comment] VARCHAR (79) NULL ); GO
Πριν από την εισαγωγή γραμμών στον πίνακα, πρέπει να προσδιορίσετε την τελευταία τιμή αναγνωριστικού που είναι αποθηκευμένη στον πίνακα. Αυτό μπορείτε να το κάνετε ανακτώντας τη μέγιστη τιμή αναγνωριστικού. Αυτή η τιμή πρέπει να εκχωρηθεί σε μια μεταβλητή, ώστε να μπορείτε να αναφερθείτε σε αυτήν κατά την εισαγωγή γραμμών πίνακα (στο επόμενο βήμα).
Ο ακόλουθος κώδικας αντιστοιχίζει την τελευταία τιμή αναγνωριστικού σε μια μεταβλητή με ονομασία
@MaxID
.--Assign the last identifier value to a variable --If the table doesn't contain any rows, assign zero to the variable DECLARE @MaxID AS BIGINT; IF EXISTS(SELECT * FROM [dbo].[Orders_with_Identifier]) SET @MaxID = (SELECT MAX([Row_ID]) FROM [dbo].[Orders_with_Identifier]); ELSE SET @MaxID = 0;
Όταν εισάγετε γραμμές στον πίνακα, οι μοναδικοί και διαδοχικοί αριθμοί υπολογίζονται προσθέτοντας την τιμή της
@MaxID
μεταβλητής στις τιμές που επιστρέφονται από τη συνάρτηση ROW_NUMBER . Αυτή η συνάρτηση είναι μια συνάρτηση παραθύρου που υπολογίζει έναν αριθμό διαδοχικής γραμμής που ξεκινά με1
.Ο ακόλουθος κώδικας T-SQL, ο οποίος εκτελείται στην ίδια δέσμη ενεργειών με τη δέσμη ενεργειών στο βήμα 2, εισάγει γραμμές στον
Orders_with_Identifier
πίνακα. Οι τιμές για τηRow_ID
στήλη υπολογίζονται προσθέτοντας τη@MaxID
μεταβλητή στις τιμές που επιστρέφονται από τηROW_NUMBER
συνάρτηση. Η συνάρτηση πρέπει να έχει ένανORDER BY
όρο, ο οποίος ορίζει τη λογική σειρά των γραμμών εντός του συνόλου αποτελεσμάτων. Ωστόσο, όταν οριστεί σεSELECT NULL
, δεν επιβάλλεται λογική σειρά, πράγμα που σημαίνει ότι οι τιμές αναγνωριστικών εκχωρούνται αυθαίρετα. Αυτός οORDER BY
όρος έχει ως αποτέλεσμα ταχύτερο χρόνο εκτέλεσης.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT @MaxID + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [Row_ID], [src].[O_OrderKey], [src].[O_CustomerKey], [src].[O_OrderStatus], [src].[O_TotalPrice], [src].[O_OrderDate], [src].[O_OrderPriority], [src].[O_Clerk], [src].[O_ShipPriority], [src].[O_Comment] FROM [dbo].[Orders] AS [src];