"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-запрос:

query output

StockSample:

stock sample

Модель:

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 первичным ключом:

  1. query = "Select *, id = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) Into stock_"+str(stock_id)+" From stocksample Where 1 = 2"
  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.

Вернуться на верх