"select * into new_table from old_table" не создает первичный ключ
Я использую sql query для динамического создания таблиц, поэтому я создал StockSample
и хочу клонировать его структуру, но при этом он не делает id по умолчанию первичным ключом и автоматически увеличивает его
Вот мой код,
cursor = connection.cursor()
query= "select * into stock_"+str(stock_id)+" from stocksample where 1=2;"
cursor.execute(query)
Что создает вышеприведенный SQL-запрос:
StockSample:
Модель:
class StockSample(models.Model):
user_id = models.ForeignKey(AppUser,on_delete=models.CASCADE)
product_name = models.CharField(max_length=100)
product_id = models.ForeignKey(Product,on_delete=models.CASCADE)
barcode = models.CharField(max_length=100, null=True, blank=True)
mrp = models.IntegerField()
selling_price = models.IntegerField()
expiry_date = models.DateField(null=True, blank=True)
Пробовал это, но все равно не делает id первичным ключом:
query = "Select *, id = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) Into stock_"+str(stock_id)+" From stocksample Where 1 = 2"
query2 = "alter table stock_"+str(stock_id)+" add primary key id" GIVES ERROR
select ... into new_table
(или предпочтительный, соответствующий стандарту create table new_table as select ....
) действительно копирует только данные, а не структуру.
Если вы хотите клонировать структуру таблицы, включая ограничения (например, первичный ключ), используйте
create table stocksample_xxx (like stocksample including indexes);
including indexes
будет копировать все определения индексов, что также приведет к повторному созданию первичного ключа. Однако не существует опции, которая копирует только первичный ключ.
Если вы также хотите скопировать определение колонки "auto increment", вам нужно отказаться от старой колонки serial
в пользу колонки recommended identity
, тогда вы можете использовать including indexes including identity
.