Oracle поменять таблицы местами

Обновлено: 06.07.2024

В таблице 2 есть поле customerId типа данных Varchar2 (30), как я могу изменить table1, чтобы добавить поле customerId того же типа данных, что и table2, используя тип%.

Я попробовал приведенный ниже код, но не повезло.

можно ли изменить, используя% type? Будет ли это работать. Пожалуйста, сообщите.

Если это не работает, я должен сделать это вручную, заявив

3 ответа

изменить таблицу table2 добавьте customer_id table1.CUSTOMER_ID% type;

%type является конструкцией PL / SQL. Мы используем его для определения локальных переменных в программе, основанных на столбцах таблицы. Это не работает в SQL.

«если тип данных customerId изменяется, мы должны везде менять вручную, вместо этого, если это копия, нам просто нужно изменить в одном месте»

Это не то, как работают базы данных Oracle (и большинство других, если не все). Они являются двигателями для хранения и извлечения данных. Они облегчают это, обеспечивая строгую типизацию данных и затрудняя небрежную потерю данных. Строгость словаря данных призвана защитить нас от ленивости.

В качестве мысленного эксперимента рассмотрим влияние на table2.customer_id , если мы выполнили одно из следующих действий:

  • alter table table1 modify customer_id not null;
  • alter table table1 modify customer_id number(6,0); - из number(9,0)
  • alter table table1 modify customer_id number(6,0); - из varchar2(6)
  • alter table table1 drop column customer_id;

Все это возможные случаи из реальной жизни. Для любого из них состояние данных в table2.customer_id может привести к сбою оператора в table2 (даже если они преуспеют в table1 ). Это желательно? Почти наверняка да. Но теперь это означает, что мы не можем изменить table1 , что значительно снижает полезность наличия столбца шаблона.

«Я думал, что это больше хорошая практика».

Лучшая практика - сделать все правильно с первого раза. Очевидно, что это не всегда возможно, потому что обстоятельства меняются со временем. Мы должны согласиться с тем, что изменения произойдут, и эффективная практика обработки изменений заключается в проведении оценки воздействия: если мы изменим table1.customer_id , что еще может повлиять? Что еще нужно будет изменить после этого? Как насчет всего программного кода, который использует эти столбцы?

Управление данными сложно, но это не просто так. В отличие от исходного кода, базы данных имеют состояние . Изменение состояния стоит дорого, а возвращение к предыдущему состоянию - еще более. Изменение типа данных столбца означает изменение состояния всех данных в этом столбце. Это не то, что должно быть сделано легко.

Так. Сделайте правильный анализ. Имейте приличную модель данных. Поймите ваши структуры данных. Это хорошие практики.

Это не ответ (математик уже сказал это вам), но комментарий немного «короткий» для того, что я хотел бы сказать.

Во время посещения конференции HrOUG я увидел человека в футболке с надписью

Спасибо, что потратили месяцы на программирование и сэкономили нам дни на планировании

Другими словами, тщательно выбирайте тип данных CUSTOMERID. Если вы продаете продукты 13 покупателям сегодня, не устанавливайте для них НОМЕР (2), потому что (если ваша компания развивается и становится процветающей), вы скоро будете продавать продукты тысячам покупателей. Будете ли вы сначала изменить его (и все его зависимые типы данных столбцов, а также все его появления в ваших приложениях) на NUMBER (3), а затем на NUMBER (4) и т. Д.? Думай о будущем!

Точно так же на той же конференции были ребята, которые сказали, что у них есть таблицы с 570 столбцами. Гоша ! 5-7-0 ! Что они делают с такими столами? Они ответили: «Мы платим Oracle много денег. Это позволяет нам создавать таблицы с 1000 столбцами, и мы собираемся использовать каждый из них». Аудитория была немного озадачена (намек: нормализация?), Но эй - это их выбор.

Да, я заметил, что вы выбрали тип данных VARCHAR2 для этого столбца ID. (Я не говорю, что это неправильно , но я почему-то предпочитаю числа вместо строк для таких целей.) Итак, что вы думаете? 30 символов будет достаточно? Сколько это будет стоить, если вы установите 50 символов? Или 100? Они не будут занимать дополнительное место на диске. Если в столбце VARCHAR2 (100 BYTE) есть «A234», это займет всего 4 байта на диске . Память - это отдельная история, так как Oracle будет предварительно выделять пространство, когда вы будете использовать такую переменную в своем коде PL / SQL, так что вы можете в конечном итоге излишне тратить пространство. Добавляете больше оперативной памяти? Конечно, это вариант, но это стоит денег.

Поэтому еще раз - тщательно спроектируйте модель данных, и вы должны быть в порядке, следуя поддерживаемому синтаксису ALTER TABLE.

Примечание . Используйте это с осторожностью .

Используйте это только после того, как вы прочитали все остальные ответы и все еще думаете, что хотите именно так.

Чтобы использовать DDL Trigger. Ниже приведен лишь пример, который рассматривает customer_id как тип NUMBER . Для VARCHAR2 , DATE и т. Д. Вам нужен универсальный способ построения DDL. См. Проблема при создании динамической таблицы

Я хочу поменять местами таблицы наилучшим образом.
У меня есть таблица IpToCountry, и я создаю новую еженедельно в соответствии с внешним CSV-файлом, который я импортирую.

самый быстрый способ, который я нашел, чтобы сделать переключатель, делал следующее:

проблема в том, что таблица все еще может быть доступна между ними.
Как подойти к этой проблеме в SQL?
В рассматриваемом используя процедуру sp_getapplock и процедура sp_releaseapplock, но я хочу, чтобы чтение из функции таблицы было как можно быстрее.

предполагая, что вы не можете обновить / вставить в существующую таблицу, почему бы вам не обернуть весь доступ к таблице с помощью посмотреть?

например, вы можете изначально хранить свои данные в таблице с именем IpToCountry20090303, и ваш взгляд будет примерно таким:

когда новые данные поступают, вы можете создать и заполнить IpToCountry20090310 таблица. Как только таблица будет заполнена, просто обновите вид:

коммутатор будет полностью атомарным, без необходимости какой-либо явной блокировки или транзакций. После обновления представления вы можете просто удалить старую таблицу (или сохранить ее, если хотите).

другим методом реализации того, чего вы хотите достичь, будет использование секционирования таблиц, метода, доступного в Enterprise Edition SQL Server.

имя таблицы может оставаться неизменным. После завершения импорта таблицы вы просто переключаете раздел, содержащий ваши старые данные, и переключаетесь в новый раздел.

в следующей белой бумаге содержится вся информация, которую вам нужно будет получить начатый.

У меня были проблемы с получением функций секционирования для работы в масштабе. Создание и удаление раздела блокируют операции, и у вас мало контроля над блокировкой, и если он не может получить блокировку, он потерпит неудачу с уровнем серьезности 16 и убьет ваше соединение, которое вы не можете поймать и повторить попытку без восстановления соединения. Но для тебя это может сработать. Кроме того, требуется MSS Enterprise Edition, вы не можете использовать SE -- может быть слишком много для некоторых меньших или более дорогостоящих магазины.

Я также обнаружил, просмотреть redef в блок на высокой шкале (= объем + объем постоянно вставляемых данных, в моем случае) на sys таблицы и объекты, поэтому эти операции взаимоблокировки на переиндексацию и DTCCs-и в одном случае, а конкретно с пользователем в среде SSMS (всех вещей) пытается просматривать представления в Обозревателе объектов (кто-то должен сказать, что аргумент readpast). Опять же, ваш пробег может варьироваться.

напротив, sp_rename хорошо работает для меня в масштабе: это дает вам контроль над блокировкой и ее объемом. Чтобы решить проблему блокировки до свопа, попробуйте, как показано ниже. По номинальной стоимости это, похоже, имеет ту же проблему масштаба при большом объеме. но я не видел этого на практике. Так что, работает на меня. но опять же, потребности и опыт каждого человека различны.

Что происходит с IpToCountryOld? Ты его выбрасываешь? В этом случае почему бы не усечь IpToCountry и импортировать мои новые данные.

Если вам нужно сохранить данные, как насчет хранения даты загрузки в таблице и хранения "текущей" даты загрузки где-то, чтобы использоваться в предложении WHERE? Затем вы переключаете текущую дату, когда данные успешно загружены.

вы не говорите, что БД вы используете, поэтому я не знаю сколько это, но у вас есть сохраненные процедуры, которые ссылаются на таблицу? Имейте в виду, что на некоторых платформах SPs компилируются с использованием внутренних ссылок на таблицы, которые не будут меняться с переименованием, поэтому существует риск, что SPs не будет получать ваши новые данные без перекомпиляции. То же самое может быть верно для представлений и сохраненных проанализированных запросов.

вы не можете сделать импорт в одну таблицу в нерабочее время?

а почему бы просто не сделать обновление данных, т. е. обновить существующие записи и добавлять новые по одной записи в цикле, чтобы импортировать данные. Это позволит таблице оставаться живой и уменьшить общее воздействие добавления и удаления полных таблиц.

какова структура импортируемых данных, дизайн таблицы, формат, PK и т. д.? От этого мы можем дать вам лучшее ответ.

просто столкнулся с аналогичной проблемой, работающей над промежуточной таблицей, у которой были проблемы с масштабированием с правильными блокировками.

везде, где упоминается ваша таблица, вы можете вызвать хранимую процедуру с запросом имени таблицы.

хранимая процедура будет создать новую таблицу(ы) или вернуть старые таблицы в зависимости от параметров.

У меня есть 2 oracle таблиц, которые идентичны по определению, но отличаются по определению раздела. Я хочу протестировать одну таблицу против другого дизайна таблицы. Есть ли способ поменять имя таблицы местами? Я не хочу бросать таблицу, потому что они большие и требуют много времени, чтобы загрузить в них данные.

3 ответа

У меня есть набор данных, как показано ниже, и я хочу поменять местами, если значение в одной переменной больше, чем в другой. данные start_year end_year 1991 1995 1994 1990 1997 1999 1994 1995 1995 1995 1996 1991 Я хочу поменять местами строки, где start_year больше, чем end_year . Ожидаемый.

Используйте синоним , указывающий на реальные таблицы.

Тест partition_table1 , например select pt.* from partition_test pt;

Тест partition_table2 , например select pt.* from partition_test pt;

Обратите внимание, что тестовый код каждый раз один и тот же.

Когда вы закончите тестирование, отбросьте синоним.

Просто переименуйте их. Например, если у вас есть TABLE_A, переименуйте его в TABLE_A_TEMP. Затем переименуйте TABLE_B в TABLE_A. Затем переименуйте TABLE_A_TEMP в TABLE_B.

Чтобы переименовать, вам придется выпустить

Третьим методом было бы использование представления. Допустим, ваши имена таблиц "real"-это TABLE_A и TABLE_B. Создайте представление, MY_DATA_VIEW (или что-то еще), и пусть оно указывает на любую таблицу, на которую вы хотите, чтобы оно указывало:

Делитесь и наслаждайтесь.

Похожие вопросы:

Я создал ячейку таблицы следующим образом <tr> <td >row 8, cell 1</td> <td >row 8, cell 2</td> </tr> цвета и размеры шрифта задаются с.

У меня есть очень специфическая проблема, когда мне нужно знать, как поменять местами элементы в списке или кортеже. У меня есть один список, который называется состоянием платы, и я знаю элементы.

У меня есть набор данных, как показано ниже, и я хочу поменять местами, если значение в одной переменной больше, чем в другой. данные start_year end_year 1991 1995 1994 1990 1997 1999 1994 1995 1995.

Я пытаюсь поменять местами строки таблицы, используя JQuery UI. Он работает хорошо, но я просто не мог получить номер строки во время события перетаскивания. Мне нужно знать номер строки для моей.

У меня есть массив заданного измерения. Я хочу поменять местами два заданных элемента массива. Я попытался поменять их местами с помощью временной переменной, но результат оказался фальшивым и.

Как поменять местами первый символ с последним символом в столбце ename из таблицы employee. I amUsing EMP таблица по умолчанию в SQL* plus Я пробовал двойную замену, но безуспешно. Пример: Смит-это.

Поменять местами значение двух столбцов в таблице без использования третьей переменной или таблицы id name lastname 1 ab cd 2 df cx 3 sd gh Я хочу поменять местами две колонки id name lastname 1 cd.

Как я могу поменять местами значения массива(в C)? Например у меня есть: Array1[] = ; и я хочу поменять местами эти числа в .

Я очень новичок в программировании R и пытался поменять последовательность местами, но я не уверен, что есть функции в R или другие способы поменять последовательность местами или нет. У меня есть.

SQL: язык структурированных запросов (Structured Query Language), называемый SQL. Это язык программирования специального назначения, язык запросов к базе данных и язык программирования, используемый для доступа к данным и запросов, обновления и управления системным языком реляционных баз данных.

  • DDL (язык определения данных): язык определения данных.
  • DML (язык манипулирования данными): язык манипулирования данными.
  • DCL (Data Control Language): язык управления данными.
  • TCL (язык управления транзакциями): язык управления транзакциями.

Обычно используемые операторы DDL включают:

  • создать таблицу: создать таблицу базы данных.
  • создать индекс: создать индекс таблицы базы данных.
  • drop table: удалить таблицу базы данных.
  • drop index: удалить индекс таблицы базы данных.
  • truncate: удалить все строки в таблице.
  • изменить таблицу: изменить структуру таблицы, добавить, изменить и удалить столбцы.
  • изменить таблицу добавить ограничение: добавить ограничение к существующей таблице.

Обычно используемые операторы DML включают:

  • вставить: добавить данные в базу данных.
  • update: изменить данные в базе данных.
  • удалить: удалить данные из базы данных.
  • select: выбрать (запросить) данные.

Обычно используемые операторы DCL:

  • grant: Предоставление разрешений или ролей пользователям или другим ролям (предоставление разрешений на доступ).
  • revoke: отозвать разрешения у пользователей или ролей базы данных (отозвать разрешения на доступ).
  • lock: заблокировать определенную часть базы данных.

Обычно используемые операторы TCL:

  • commit: зафиксировать обработку транзакции.
  • откат: откат обработки транзакции.
  • точка сохранения: установите точку сохранения.

Примечание. Используйте инструмент SQLDeveloper для переключения между двумя пользователями. Вы не можете использовать команду «conn username / password» для переключения соединения. Команда подключения является командой SQLPlus. Окно выполнения SQL в инструменте SQLDeveloper не может быть выполнено, а инструмент SQLDeveloper - нет. Предоставьте окно для выполнения команд SQLPlus,
Если вы хотите подключиться к базе данных, используйте графические операции

Типы данных, обычно используемые в Oracle: типы символов, числовые типы, типы даты и времени и типы больших объектов.

  • char: представляет символьную строку фиксированной длины. Длина столбца может составлять от 1 до 2000 байтов.
  • varchar2: представляет строку символов переменной длины. Максимальная длина - 4000 байт.

Числовой тип (содержание в скобках [] необязательно): number [(p [, s])]. p означает точность, s означает количество десятичных знаков; он может хранить целые числа, числа с плавающей запятой и другие числовые типы; максимальная точность составляет 38 цифр.

  • CLOB: Символьный LOB (символьный LOB), способный хранить большие объемы символьных данных.
  • BLOB: двоичный LOB (двоичный LOB), который может хранить большие двоичные объекты, такие как графика, видеоклипы и звуковые файлы.

Ограничения - это способ автоматического поддержания целостности базы данных, обеспечиваемый Oracle. Он гарантирует целостность данных, ограничивая данные в полях, данные в записях и данные между таблицами.

Ограничение первичного ключа (первичный ключ): первичный ключ определяемой пользователем базовой таблицы. Это идентификатор, который однозначно определяет каждую запись в таблице. Его значение не может быть нулевым или повторяться, чтобы гарантировать целостность объекта. В таблице только один первичный ключ, но он может состоять из нескольких столбцов.

Ограничение уникальности: используется для указания уникальности объединенного значения одного или нескольких столбцов, чтобы предотвратить ввод повторяющихся значений в столбец.

Примечания к ограничениям уникальности:

  • Столбцы, использующие уникальные ограничения, могут быть пустыми.
  • В таблице допускается несколько уникальных ограничений.
  • Ограничение уникальности можно определить для нескольких столбцов.

Ограничение внешнего ключа: один или несколько столбцов, используемых для установления и усиления связи между данными двух таблиц. Ограничения внешнего ключа - единственные ограничения, которые определяют связь между двумя таблицами.

Примечания к ограничениям внешнего ключа:

  • При установке ограничений внешнего ключа поля первичной таблицы должны быть столбцами первичного ключа (или уникальными столбцами).
  • Соответствующие поля в главной и подчиненной таблицах должны иметь один и тот же тип данных.
  • Значение поля внешнего ключа во вторичной таблице должно происходить из значения соответствующего поля в первичной таблице или быть нулевым значением.

Что такое транзакция?

Транзакцию можно рассматривать как единицу, состоящую из нескольких операций с базой данных, и эти операции либо завершаются, либо отменяются, чтобы гарантировать соответствие данных требованиям согласованности.

  • Один или несколько DML
  • DDL
  • DCL

Примечание: операторы DML должны использовать фиксацию для фиксации транзакции или использовать откат для отката транзакции; DDL и DCL автоматически фиксируются для транзакции.

Зачем использовать транзакции?

Обеспечьте безопасность и эффективность данных.

Когда выполняется операция транзакции (оператор DML), Oracle добавит блокировку таблицы в затронутую таблицу, чтобы другие пользователи не могли изменить структуру таблицы; в то же время он также добавит блокировку строки в активной строке, чтобы предотвратить выполнение других транзакций в соответствующей строке Операция DML.

Команды управления транзакцией:

  • Зафиксировать транзакцию (совершить)
  • Транзакция может быть отправлена ​​с помощью оператора фиксации.Когда оператор фиксации выполняется, изменение транзакции будет подтверждено, транзакция будет завершена, точка сохранения будет удалена, и блокировка будет снята.
  • Когда для завершения транзакции используется оператор фиксации, другие сеансы смогут просматривать новые данные после изменения транзакции.
  • Точка сохранения (savepoint): точка в транзакции, используемая для отмены части транзакции. Когда транзакция завершается, все точки сохранения, определенные транзакцией, будут автоматически удалены. При выполнении отката вы можете вернуться к указанной точке, указав точку сохранения.


Что такое словарь данных?

  • Словарь данных - это место, где Oracle хранит информацию о базе данных, и его цель - описать данные. Словарь данных базы данных - это набор таблиц и структуры.
  • К таблицам словаря данных нельзя получить доступ напрямую, но можно получить доступ к попыткам в словаре данных.

Роль словаря данных: через словарь данных мы можем понять информацию внутри базы данных. Когда пользователи сталкиваются с трудностями при работе с данными в базе данных, они могут получить доступ к словарю данных для просмотра подробной информации.

Словари данных, обычно используемые в Oracle: Словари данных, обычно используемые в Oracle, делятся на три категории, начинающиеся с трех префиксов:

  • user_ *: в этом представлении хранится информация об объектах, принадлежащих текущему пользователю. (Т.е. все объекты в пользовательском режиме)
  • all_ *: это представление хранит информацию об объектах, к которым текущий пользователь может получить доступ. (По сравнению с user_ *, all_ * не нужно владеть объектом, нужно только иметь разрешение на доступ к объекту)
  • dba_ *: это представление хранит информацию обо всех объектах в базе данных. (Предпосылка заключается в том, что текущий пользователь имеет доступ к этим базам данных, вообще говоря, должен иметь права администратора)

Словарь данных, обычно используемый в Oracle:


Используйте словарь данных для просмотра соответствующей информации о базе данных:

ALTER TABLE: команда изменения структуры таблиц в Oracle

Мы научились создавать таблицы в базе данных Oracle на предыдущем шаге. Таблицы и колонки таблиц, их названия, расположение, последовательность колонок, типы данных колонок называются структурой таблицы.

Структуру таблицы можно менять, то есть добавлять новые колонки в таблицу, удалять колонки из таблицы, менять типы данных у заданной колонки. Также, если таблица нам больше не нужна или просто надоела, существует возможность такую таблицу удалить.

Теория и практика

Существует несколько команд для изменения структуры таблицы, добавления, удаления или изменения типа данных колонки таблицы.

Все эти команды объединяет то, что они начинаются с ключевой команды ALTER TABLE .

Добавление колонки

Добавляем новую колонку к нашей таблице.

Синтаксис:

TABLE_NAME – наименование таблицы.

Column_NAME – наименование колонки.

Column_type – тип данных колонки ( VARCHAR (n) или NUMBER или DATE ).

Примеры:

Пусть у нас есть таблица GOODS, необходимо добавить колонку itemprice типа NUMBER , цена изделия.

Пусть у нас есть таблица MANS, необходимо добавить колонку DATEreg типа DATE , дата регистрации, и колонку patronymic – отчество VARCHAR2 (50) .

Удаление колонки

Также мы можем удалить колонку из заданной таблицы с помощью специальной SQL-команды DROP COLUMN .

Синтаксис:

Примеры:

Пусть у нас есть таблица GOODS, необходимо удалить колонку COLOR .

Пусть у нас есть таблица MANS, необходимо удалить колонку YEAROLD .

Меняем тип данных для колонки таблицы.

Синтаксис изменения типа колонки:

Сolumn_NAME – наименование колонки.

Data_type – тип данных колонки ( VARCHAR (n) или NUMBER или DATE ).

Примеры:

– заменить в таблице MANS тип поля NAME на VARCHAR2 (90) ;

– заменить в таблице GOODS тип поля INSERT_DATE на DATE;

Удаление таблицы из базы данных Oracle

Синтаксис команды SQL для удаления таблицы:

Здесь TABLE_NAME – наименование таблицы.

Примеры:

– удалить таблицу DOC ;

– удалить таблицу ITEMS ;

– удалить таблицу BILLING_PERIOD со связанными данными в таблице PERIODS.

Важные замечания

  1. При выполнении действий по изменению структуры таблицы следует быть особенно осторожным, следует тщательно взвешивать свои действия: восстановление таблицы в прежнем виде может быть затруднительно или невозможно.
  2. Если вы используете команды изменения типов данных и встречаетесь с ошибкой ORA-01439 , модифицируемый столбец при смене типа данных должен быть пуст. Сохраните данные в столбце и используйте специальные преобразования, о которых будет рассказано в следующих шагах.
  3. В некоторых случаях удаление таблицы или колонки таблицы будет запрещено, поскольку могут быть еще таблицы со связанными данными. Требуется сначала удалить данные в связанных таблицах, а уже затем удалять таблицу либо колонку. Или же воспользоваться специальной командой DROP CASCADE.

Возможные вопросы

Да, вполне, и для этого есть две команды:

Универсальный же синтаксис предполагает использование ALTER TABLE .

Примеры:

Переименуем таблицу с названием STAFF в EMP:

Переименуем таблицу с названием TRADES в TRADE:

Можно ли переименовать столбец в таблице?

Да, синтаксис команды:

Пример:

Переименовать колонку с наименованием NAME в таблице STAFF в колонку LASTNAME :

Читайте также: