В Oracle действительно ли возможно “вставить” столбец в таблицу?

Я подозреваю, что проблема в этой строке:

sudo ln -s python3.5 /usr/bin/python3

Вы выполняли его из каталога с двоичным файлом python3.5?

9
задан Brian Tompsett - 汤莱恩 16 September 2016 в 19:12
поделиться

9 ответов

Местоположение столбца в таблице должно быть неважным (если нет "размеры страницы" для рассмотрения, или независимо от того, что Oracle использует, чтобы на самом деле хранить данные). То, что более важно для потребителя, - то, как результаты называют, т.е. оператор Select.

8
ответ дан 4 December 2019 в 09:14
поделиться

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

2
ответ дан 4 December 2019 в 09:14
поделиться

переименуйте YOUR_ORIGINAL_TABLE как YOUR_NEW_TABLE;

создайте таблицу YOUR_ORIGINAL_TABLE nologging/* или неисправимый */как избранный Column1, Column2, NEW_COLUMN, Column3 от YOUR_NEW_TABLE;

Таблица YOUR_NEW_TABLE отбрасывания;

Выберите * Из YOUR_ORIGINAL_TABLE; <<<<<теперь Вы будете видеть новый столбец посреди таблицы.

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

6
ответ дан 4 December 2019 в 09:14
поделиться

То, что я обычно делаю:

  1. Переименуйте старую таблицу.
  2. Составьте новую таблицу со столбцами в правильном порядке.
  3. Создайте ограничения для той новой таблицы.
  4. Заполните с data:Insert в выбор new_table * от переименованной таблицы.
2
ответ дан 4 December 2019 в 09:14
поделиться

Почему делает порядок вопроса столбцов? Можно ли всегда изменять его в избранном операторе?

Существует преимущество для добавления новых столбцов в конце таблицы. Если будет код, который наивно делает "ВЫБОР *" и затем анализирует поля в порядке, то Вы не будете взламывать старый код путем добавления новых столбцов в конце. Если Вы добавляете новые столбцы посреди таблицы, то старый код может быть взломан.

В одном задании у меня был DBA, кто был суперанальным о, "Никогда 'не ВЫБИРАЮТ *'". Он настоял, чтобы Вы всегда выписали определенные поля.

3
ответ дан 4 December 2019 в 09:14
поделиться

Я не верю так - SQL Server не позволяет их также. Метод, который я всегда должен использовать:

  1. Составьте новую таблицу, которая выглядит правильной (включая дополнительный столбец
  2. Начните транзакцию
  3. выберите все данные из старой таблицы в новую
  4. Отбросьте старую таблицу
  5. Переименуйте новую таблицу
  6. Транзакция фиксации.

Не точно симпатичный, но сделали задание.

1
ответ дан 4 December 2019 в 09:14
поделиться

Примите во внимание, что под таблицами все данные в записях таблицы склеены. Добавление столбца в конец таблицы [если это nullable или (в более поздних версиях) не пустой со значением по умолчанию] просто, означает изменение в метаданных таблицы. Добавление столбца в середине потребовало бы, чтобы перезапись каждой записи в той таблице добавила соответствующее значение (или маркеры) для того столбца. В некоторых случаях это могло бы означать, что записи поднимают больше комнаты на блоках, и должны быть перемещены некоторые записи. Короче говоря, это - Огромное количество усилия IO для таблицы любого реального размера.

Можно всегда создавать представление по таблице, которая имеет столбцы в предпочтительном порядке, и используйте то представление в операторе DML так же, как Вы были бы таблица

2
ответ дан 4 December 2019 в 09:14
поделиться

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

У Tom Kyte есть статья об этом на тексте ссылки AskTom

0
ответ дан 4 December 2019 в 09:14
поделиться

1) Хорошо, вы не можете сделать это напрямую. Нам не нужен пост за постом, в котором говорится одно и то же, не так ли?

2) Хорошо, поэтому порядок столбцов в таблице технически не имеет значения. Но дело не в этом, исходный вопрос просто спрашивал, можно или нельзя сделать. Не думайте, что вы знаете требования других. Может быть, у них есть таблица со 100 столбцами, которая в настоящее время запрашивается с использованием «SELECT * ...» внутри какого-то чудовищно взломанного запроса, который они просто предпочли бы не пытаться распутывать, не говоря уже о замене «*» на 100 имен столбцов. Или, может быть, они просто озабочены порядком вещей и любят располагать связанные поля рядом друг с другом при просмотре схемы, скажем, с помощью SQL Developer. Возможно, они имеют дело с нетехническим персоналом, который не знает, что нужно смотреть в конец списка из 100 столбцов, когда, по логике, он должен быть где-то в самом начале.

Нет ничего более раздражающего, чем задать честный вопрос и получить ответ, который гласит: «Ты не должен этого делать». Это МОЯ работа, а не ВАША! Пожалуйста, не говорите мне, как делать мою работу. Просто помогите, если сможете. Спасибо!

Хорошо ... извините за тираду. Теперь ... на сайте www.orafaq.com предлагается этот обходной путь.

Сначала предположим, что вы уже выполнили:

CREATE TABLE tab1 (col1 NUMBER);

Теперь предположим, что вы хотите добавить столбец с именем «col2», но хотите, чтобы они упорядочены как «col2», «col1», когда выполнение «SELECT * FROM tbl1;»

Предлагается выполнить:

ALTER TABLE tab1 ADD (col2 DATE); ПЕРЕИМЕНОВАТЬ tab1 TO tab1_old; СОЗДАТЬ ТАБЛИЦУ tab1 AS SELECT 0 AS col1, col1 AS col2 FROM tab1_old;

Я обнаружил, что это невероятно вводит в заблуждение.Прежде всего, вы заполняете "col1" нулями, поэтому, если у вас есть какие-либо данные, вы теряете их, делая это. Во-вторых, он фактически переименовывает «col1» в «col2» и не упоминает об этом. Итак, вот мой пример, надеюсь, он немного понятнее:

Предположим, у вас есть таблица, созданная с помощью следующего оператора:

CREATE TABLE users (first_name varchar (25), last_name varchar (25));

Теперь предположим, что вы хотите вставить middle_name между first_name и last_name. Вот один способ:

ALTER TABLE пользователи ДОБАВЛЯТЬ middle_name varchar (25); ПЕРЕИМЕНОВАТЬ пользователей НА users_tmp; СОЗДАТЬ ТАБЛИЦУ пользователей КАК ВЫБРАТЬ first_name, middle_name, last_name FROM users_tmp; / * и на всякий случай ... * / DROP TABLE testusers_tmp;

Обратите внимание, что middle_name по умолчанию будет равно NULL (подразумевается оператором ALTER TABLE). В качестве альтернативы вы можете установить другое значение по умолчанию в операторе CREATE TABLE следующим образом:

CREATE TABLE users AS SELECT first_name, 'some default value' AS middle_name, last_name FROM users_tmp;

Этот трюк может пригодиться, если вы ' повторно добавив поле даты со значением по умолчанию sysdate, но вы хотите, чтобы все существующие записи имели другое (например, более раннее) значение даты.

-1
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

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