- How To Generate Surrogate Key In Sql
- Surrogate Key In Oracle
- Example Of Surrogate Key In Sql
- Generate Surrogate Key In Sql Server Download
This article demonstrates how to “roll your own” surrogate keys and sequences in a platform-independent way, using standard SQL.
Jan 31, 2011 When a primary key is generated at runtime, it is called a surrogate key. A surrogate key is typically a numeric value. Within SQL Server, Microsoft allows you to define a column with an identity property to help generate surrogate key values. Oct 04, 2012 Surrogate Key Generator using SSIS – Learn more on the SQLServerCentral forums. I need to generate a surrogate key in the following format. What version of SQL are you in? - Craig Farrell.
- Learn how to define an auto increment primary key in SQL Server. This data tutorial will explain basic table creation and information around using identity a.
- You might be able to do this in three steps within the DB to create the surrogate PK. Alter the table to create the surrogate key column. Except, it has to be nullable. Browse other questions tagged sql sql-server sql-server-2008-r2 or ask your own question.
Surrogate keys
Relational theory talks about something called a “candidate key.” In SQL terms, a candidate key is any combination of columns that uniquely identifies a row (SQL and the relational model aren’t the same thing, but I’ll put that aside for this article). The data’s primary key is the minimal candidate key. Many people think a primary key is something the DBA defines, but that’s not true. The primary key is a property of the data, not the table that holds the data.
Unfortunately, the minimal candidate key is sometimes not a good primary key in the real world. For example, if the primary key is 6 columns wide and I need to refer to a row from another table, it’s impractical to make a 6-column wide foreign key. For this reason, database designers sometimes introduce a surrogate key, which uniquely identifies every row in the table and is “more minimal” than the inherently unique aspect of the data. The usual choice is a monotonically increasing integer, which is small and easy to use in foreign keys.
Every RDBMS of which I’m aware offers a feature to make surrogate keys easier by automatically generating the next larger value upon insert. In SQL Server, it’s called an
IDENTITY
column. In MySQL, it’s called AUTO_INCREMENT
. It’s possible to generate the value in SQL, but it’s easier and generally safer to let the RDBMS do it instead. This does lead to some issues itself, such as the need to find out the value that was generated by the last insertion, but those are usually not hard to solve (LAST_INSERT_ID()
and similar functions, for example).It’s sometimes desirable not to use the provided feature. For instance, I might want to be sure I always use the next available number. In that case, I can’t use the built-in features, because they don’t generate the next available number under some circumstances. For example, SQL Server doesn’t decrement the internal counter when transactions are rolled back, leaving holes in the data (see my article on finding missing numbers in a sequence). Neither MySQL nor SQL Server decrements the counter when rows are deleted.
In these cases, it’s possible to generate the next value in the insert statement. Suppose my table looks like this:
The next value for
c1
is simply the maximum value + 1. If there is no maximum value, it is 1, which is the same as 0 + 1.There are platform-dependent ways to write that statement as well, such as using SQL Server’s
ISNULL
function or MySQL’s IFNULL
. This code can be combined into an INSERT
statement, such as the following statement to insert 3 into the second column:The code above is a single atomic statement and will prevent any two concurrent inserts from getting the same value for
c1
. It is not safe to find the next value in one statement and use it in another, unless both statements are in a transaction. I would consider that a bad idea, though. There’s no need for a transaction in the statement above.Downsides to this approach are inability to find the value of
c1
immediately after inserting, and inability to insert multiple rows at once. The first problem is inherently caused by inserting meaningless data, and is always a problem, even with the built-in surrogate keys where the RDBMS provides a mechanism to retrieve the value.Sequences: a better surrogate key
Surrogate keys are often considered very bad practice, for a variety of good reasons I won’t discuss here. Sometimes, though, there is just nothing for it but to artificially unique-ify the data. In these cases, a sequence number can often be a less evil approach. A sequence is just a surrogate key that restarts at 1 for each group of related records. For example, consider a table of log entries related to records in my
t1
table:At this point I might want to enter some more records (0, 11) into
t1
:Now suppose I want the following three log entries for the first row in
t1
:There’s no good primary key in this data. I will have to add a surrogate key. It might seem I could add a date-time column instead, but that’s a dangerous design. It breaks as soon as two records are inserted within a timespan less than the maximum resolution of the data type. It also breaks if two records are inserted in a single transaction where the time is consistent from the first to the last statement. I’m much happier with a sequence column. The following statement will insert the log records as desired:
If I want to enter a log record on another record in
t1
, the sequence will start at 1 for it: Crypto key generate rsa cisco 4500.MySQL actually allows an
-->AUTO_INCREMENT
value to serve as a sequence for certain table types (MyISAM and BDB). To do tihs, just make the column the last column in a multi-column primary key. I’m not aware of any other RDBMS that does this.You can define a primary key in SQL Server by using SQL Server Management Studio or Transact-SQL. Creating a primary key automatically creates a corresponding unique clustered index, or a nonclustered index if specified as such.
Before You Begin
Limitations and Restrictions
- A table can contain only one PRIMARY KEY constraint.
- All columns defined within a PRIMARY KEY constraint must be defined as NOT NULL. If nullability is not specified, all columns participating in a PRIMARY KEY constraint have their nullability set to NOT NULL.
Security
Permissions
Creating a new table with a primary key requires CREATE TABLE permission in the database and ALTER permission on the schema in which the table is being created.
Creating a primary key in an existing table requires ALTER permission on the table.
Using SQL Server Management Studio
To create a primary key
- In Object Explorer, right-click the table to which you want to add a unique constraint, and click Design.
- In Table Designer, click the row selector for the database column you want to define as the primary key. If you want to select multiple columns, hold down the CTRL key while you click the row selectors for the other columns.
- Right-click the row selector for the column and select Set Primary Key.
Caution
If you want to redefine the primary key, any relationships to the existing primary key must be deleted before the new primary key can be created. A message will warn you that existing relationships will be automatically deleted as part of this process.
How To Generate Surrogate Key In Sql
A primary key column is identified by a primary key symbol in its row selector.
Surrogate Key In Oracle
If a primary key consists of more than one column, duplicate values are allowed in one column, but each combination of values from all the columns in the primary key must be unique.
If you define a compound key, the order of columns in the primary key matches the order of columns as shown in the table. However, you can change the order of columns after the primary key is created. For more information, see Modify Primary Keys.
Using Transact-SQL
To create a primary key in an existing table
![Generate Surrogate Key In Sql Server Generate Surrogate Key In Sql Server](/uploads/1/2/6/0/126074218/701785836.png)
The following example creates a primary key on the column
TransactionID
in the AdventureWorks database.To create a primary key in a new table
The following example creates a table and defines a primary key on the column
TransactionID
Paretologic data recovery license key generator. in the AdventureWorks database.To create a primary key with clustered index in a new table
Example Of Surrogate Key In Sql
The following example creates a table and defines a primary key on the column
CustomerID
and a clustered index on TransactionID
in the AdventureWorks database.