Κοινή χρήση μέσω


Δημιουργία μοναδικών αναγνωριστικών σε έναν πίνακα αποθήκης στο Microsoft Fabric

Ισχύει για:✅ Warehouse στο Microsoft Fabric

Είναι συνηθισμένη απαίτηση στις αποθήκες δεδομένων να εκχωρείτε ένα μοναδικό αναγνωριστικό σε κάθε γραμμή ενός πίνακα. Σε περιβάλλοντα που βασίζονται σε SQL Server, αυτό συνήθως γίνεται με τη δημιουργία μιας στήλης ταυτότητας σε έναν πίνακα, ωστόσο, προς το παρόν αυτή η δυνατότητα δεν υποστηρίζεται σε μια αποθήκη στο Microsoft Fabric. Αντίθετα, πρέπει να χρησιμοποιήσετε μια τεχνική λύσης. Παρουσιάζουμε δύο εναλλακτικές.

Αυτό το άρθρο περιγράφει τεχνικές λύσης για τη δημιουργία μοναδικών αναγνωριστικών σε έναν πίνακα αποθήκης.

Μέθοδος 1

Αυτή η μέθοδος ισχύει περισσότερο όταν χρειάζεται να δημιουργήσετε τιμές ταυτότητας, αλλά η σειρά των τιμών δεν είναι σημαντική (οι μη έγκυρες τιμές είναι αποδεκτές).

Οι μοναδικές τιμές δημιουργούνται στον κώδικα που εισάγει δεδομένα στον πίνακα.

  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
    );
    
  2. Όταν εισάγετε γραμμές στον πίνακα, μέσω δεσμών ενεργειών 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

Αυτή η μέθοδος εφαρμόζεται περισσότερο όταν χρειάζεται να δημιουργήσετε διαδοχικές τιμές ταυτότητας, αλλά θα πρέπει να χρησιμοποιείται προσεκτικά σε μεγαλύτερα σύνολα δεδομένων, καθώς μπορεί να είναι πιο αργή από τις εναλλακτικές μεθόδους. Θα πρέπει επίσης να ληφθούν υπόψη οι πολλαπλές διαδικασίες εισαγωγής δεδομένων ταυτόχρονα, καθώς αυτό μπορεί να οδηγήσει σε διπλότυπες τιμές.

  1. Για να δημιουργήσετε μοναδικά δεδομένα χρησιμοποιώντας αυτή τη μέθοδο, δημιουργήστε έναν πίνακα που περιλαμβάνει μια στήλη που αποθηκεύει μοναδικές τιμές αναγνωριστικού. Ο τύπος δεδομένων στήλης πρέπει να οριστεί σε ενσωματωμένο ή μεγάλο μέγεθος, ανάλογα με τον όγκο των δεδομένων που περιμένετε να αποθηκεύσετε. Θα πρέπει επίσης να ορίσετε τη στήλη ώστε 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
    
  2. Πριν από την εισαγωγή γραμμών στον πίνακα, πρέπει να προσδιορίσετε την τελευταία τιμή αναγνωριστικού που είναι αποθηκευμένη στον πίνακα. Αυτό μπορείτε να το κάνετε ανακτώντας τη μέγιστη τιμή αναγνωριστικού. Αυτή η τιμή πρέπει να εκχωρηθεί σε μια μεταβλητή, ώστε να μπορείτε να αναφερθείτε σε αυτήν κατά την εισαγωγή γραμμών πίνακα (στο επόμενο βήμα).

    Ο ακόλουθος κώδικας αντιστοιχίζει την τελευταία τιμή αναγνωριστικού σε μια μεταβλητή με ονομασία @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;
    
  3. Όταν εισάγετε γραμμές στον πίνακα, οι μοναδικοί και διαδοχικοί αριθμοί υπολογίζονται προσθέτοντας την τιμή της @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];